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.yml to inspect schema and resources
- 2. Download data resources listed in datapackage.yml
- 3. Read README.md for full context
Data Files
Postal Codes Data Resource for Serbia, RS
| Field | Description | Title |
|---|---|---|
| country_code | ISO 3166-1 alpha-2 code for the country. | Country Code |
| postal_code | Postal code for the location. | Postal Code |
| place_name | Name of the city, town, or place. | Place Name |
| admin_name1 | Primary administrative division (e.g., state, region). | Administrative Name 1 |
| admin_code1 | Code for the primary administrative division. | Administrative Code 1 |
| admin_name2 | Secondary administrative division (e.g., county, district). | Administrative Name 2 |
| admin_code2 | Code for the secondary administrative division. | Administrative Code 2 |
| admin_name3 | Tertiary administrative division (e.g., municipality, borough). | Administrative Name 3 |
| admin_code3 | Code for the tertiary administrative division. | Administrative Code 3 |
| latitude | Latitude coordinate of the place. | Latitude |
| longitude | Longitude coordinate of the place. | Longitude |
| accuracy | Accuracy level of the latitude and longitude coordinates. | Accuracy |
| alternative_city_name | Alternative name(s) for the city or place. | Alternative City Name |
Download
Download sample CSVAbout
- Last updated
- 31 August 2026
- Total rows
- ...
- Format
- CSV
- File size
- 76 kB
About this dataset
Serbia (RS) — internal licensing notes
Source research, 2026-08-31
Clean GO on GeoNames; no official bulk source exists.
What's currently live is corrupted
R2's rs/rs.csv (1,155 rows, matches _meta/catalog.json) is a pandas
round-trip of GeoNames' raw postal export with every admin field written
as the literal string "nan" instead of blank — confirmed directly by
downloading and inspecting the live object. admin_name1/admin_name2/
admin_name3 are "nan" on all 1,155/1,155 rows. Same defect class
already found and fixed in PL, AL, TH. datapackage.yml's declared
resource size (5,011 bytes, dated 2024-11-07) doesn't even match the live
object (65,967 bytes) — the storefront metadata is stale on top of the
data defect.
Source 1 — GeoNames RS postal export (the base)
https://download.geonames.org/export/zip/RS.zip # 1,155 rows
Licence CC BY 4.0, verified against export/zip/readme.txt on
2026-08-31 — no per-country caveat for Serbia. Carries place_name +
coordinates only — zero admin fields on every row, verified directly
(not a formatting artifact; the raw file itself has empty admin columns).
Source 2 — GeoNames RS gazetteer dump (admin enrichment, same publisher)
https://download.geonames.org/export/dump/RS.zip # 24,543 entries
Same licence, same publisher, not a new source. Carries a genuine 2-tier
admin hierarchy for 9,511 populated-place entries via GeoNames' own
admin1 (SE = Serbia proper, VO = Vojvodina) and admin2 (a 0–24
numeric district code) fields.
Real finding: GeoNames' numeric admin2 codes map 1:1 onto the actual
ISO 3166-2:RS district (okrug) codes — verified against
en.wikipedia.org/wiki/ISO_3166-2:RS on 2026-08-31. E.g. VO.6 ("South
Bačka") = RS-06. These are Serbia's real, citable subdivision codes,
not GeoNames-internal ids standing in for them.
One name correction applied: GeoNames' own admin2Codes.txt labels
district RS-17 "Morava"; the ISO register and every other source name
it "Moravica" (Moravički okrug). Corrected on output, disclosed.
❌ Posta Srbije — no bulk source, not a licensing block
posta.rs exposes only a single-address postal-code lookup tool
(/pak/pretraga-pak.aspx, confirmed 404/lookup-only on 2026-08-31) —
there is no downloadable list, PDF, or API. This is a data-availability
gap, not a licensing restriction like Poland's Poczta Polska or Serbia
having a resale prohibition — there's simply nothing bulk to acquire.
What ships
rs.csv — 1,155 rows (1,149 distinct postal codes), 13-column
postal-codes schema. admin_name1/admin_code1 = district/okrug
(25/25 covered) via a same-source GeoNames-to-GeoNames coordinate join.
admin_name2/admin_code2 = "Vojvodina"/RS-VO on the 393 rows in
Vojvodina's 7 districts; genuinely empty on the other 762 rows (18
districts including Belgrade), because Serbia's real ISO structure gives
those districts no parent province code — not a coverage gap.
admin_name3/admin_code3 not populated (no opština/municipality-level
source found).
Join quality measured directly before shipping: 1,088 rows matched by exact place name (median distance to the matched gazetteer point: 4 m — the two GeoNames exports evidently share coordinates for most places); 67 rows matched by coordinate-only fallback (median 1.1 km, max 4.9 km). Zero rows unresolved.
Known source defect, disclosed not corrected: postal code 14000's
"Lipljan" row shares its exact coordinate with that code's genuine
"Valjevo" row. Lipljan is a real town, but in Kosovo — ~230 km away. This
is an upstream GeoNames error (this build doesn't alter source
coordinates or drop rows), flagged in README.md/ATTRIBUTION.txt so a
consumer doesn't trust that one row's district assignment.
licence_status
{
"channel": "postal-codes-r2",
"source_url": "https://download.geonames.org/export/zip/RS.zip",
"licence_id": "CC-BY-4.0",
"collected_at": "2026-08-31",
"decision": "compatible",
"decided_by": "claude-session-2026-08-31",
"decided_at": "2026-08-31",
"note": "No official bulk source exists to consolidate onto GeoNames; admin enrichment is same-publisher/same-licence GeoNames-to-GeoNames, not a second source with its own terms."
}
Proposed tier
B ($49). Single publisher (GeoNames, both exports), normalised in
place with real derivation work — the same-source gazetteer join,
verified ISO crosswalk, and the Morava→Moravica correction — but no
independent second-source consolidation (Poland/Mexico/Finland-shaped),
so this doesn't clear tier A's bar per docs/PRICING_TIERS.md.
Moat
Low. GeoNames is openly downloadable by anyone; the district-join technique (same-source dump-to-postal coordinate matching) is now a standard, documented pattern in this catalogue (first used for South Africa) rather than a one-off trick. A competitor with GeoNames access reproduces most of this in an afternoon. The genuine value-add — fixing the "nan" corruption, deriving verified ISO codes, and catching the Lipljan/Valjevo defect — is real but not structurally hard to redo.
Build — 2026-08-31 (local only, not published)
Built via datasets/rs/scripts/build_postal_codes_product.py. Frictionless
validation: valid: True. Nothing published to R2 (still shows the stale
"nan"-corrupted file), nothing committed to git.