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
- Open Government Licence Romania v1.0 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-ro-sample
| Field | Type | Description | Constraints | Title |
|---|---|---|---|---|
| country_code | string | ISO 3166-1 alpha-2 -- always RO | Country Code | |
| postal_code | string | Romanian postal code (6 digits) | { "pattern": "^\\d{6}$" } | Postal Code |
| place_name | string | Street name (Bucuresti and cities >50,000 population) or locality name (elsewhere) -- the finest named place this row identifies | Place Name | |
| admin_name1 | string | County (Judet), or Bucuresti | Administrative Name 1 | |
| admin_code1 | string | ISO 3166-2:RO code | Administrative Code 1 | |
| admin_name2 | string | Locality (comuna/oras) or Bucuresti sector | Administrative Name 2 | |
| admin_code2 | string | Official SIRUTA code (Romania's INS administrative-unit registry) | Administrative Code 2 | |
| admin_name3 | string | Not used in this release -- the real hierarchy here is two levels (judet -> localitate/sector) | Administrative Name 3 | |
| admin_code3 | string | SIRSUP (SIRUTA superior-unit code), where the source provides one | Administrative Code 3 | |
| latitude | number | Not available -- source carries no coordinates | Latitude | |
| longitude | number | Not available -- source carries no coordinates | Longitude | |
| accuracy | string | Not applicable -- no coordinates in this release | 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
- 7.8 kB
About this dataset
Romania (RO) — internal licensing notes
Source research + sellability audit, 2026-08-28
RO is the same defect class as TH, but bigger, and has a stronger available upgrade than TH's did. What's live is a straight GeoNames re-export with the identical pandas NaN/float round-trip bug found and fixed for Thailand — and there is a genuinely official, cleanly-licensed, street-level replacement source sitting on Romania's own open data portal that nobody has evaluated yet.
What is currently sold — GeoNames RO, and it is broken the same way TH was
https://download.geonames.org/export/zip/RO.zip 37,915 rows
Licence CC-BY-4.0, verified against export/zip/readme.txt on 2026-08-28 — no
per-country caveat for Romania (only UK/Royal Mail and Chile carry one). Legally
sellable. The problem is the same content bug as TH, at much larger scale:
| value | |
|---|---|
| rows | 37,915 |
| distinct postal codes | 37,914 (near-unique — RO's codes are already close to address-level) |
literal "nan" string cells | 51,032 (admin_name2 × 25,516, admin_name3 × 25,516) |
| float-formatted numeric fields | accuracy ("4.0"/"1.0" on 30,246 rows), admin_code2/admin_code3 ("179132.0" instead of "179132" on 12,399 rows each) |
| county coverage | 42 / 42 — full national coverage (41 județe + București) |
| duplicates | 0 on (country_code, postal_code, place_name) |
alternative_city_name | populated on 7,426 rows — real content, do not drop it (see TH's mistake) |
Root cause confirmed identical to TH: the raw GeoNames source has genuine integers
(e.g. admin_code3 = 11055041) and genuine empty fields — a pandas
read/to_csv round-trip is what turns the empty ones into the string "nan" and
the integer ones into "179132.0". Rebuilding straight from the raw tab-delimited
source with the csv module (no pandas), exactly as done for TH, fixes both
defects without needing a new source at all. This alone is shippable today,
same tier B, same "no decision needed" status as TH's cleanup.
Real upgrade candidate — Poșta Română via data.gov.ro (OGL-ROU-1.0)
This is the part TH did not have available: an official, street-level, cleanly-licensed replacement, not just a cleanup of the existing source.
-
Dataset:
https://data.gov.ro/dataset/coduri-postale-romania, published by Poșta Română (the state postal operator) directly on Romania's national open data portal. -
Licence: OGL-ROU-1.0 (Open Government Licence Romania v1.0), Open Definition-compliant. Verified verbatim from
data.gov.ro/pages/licenceon 2026-08-28: users may "refolosească informația în scop comercial sau necomercial" ("reuse the information for commercial or non-commercial purposes") — explicit commercial permission — subject to attribution ("declare sursa informației" / display "Conține informații publice în baza Licenței pentru Guvernare Deschisă v1.0"). This is a real, named, checkable licence — not an unsourced aggregator. -
File:
infocod-cu-siruta-mai-2016.xls(7.8 MB, downloaded and inspected directly on 2026-08-28, not just described secondhand). Three sheets:Sheet Rows Granularity Bucuresti12,400 Street-level — street type, street name, house-number range, sector, SIRUTA sector code Localitati peste 50.000 loc29,204 Street-level for every city over 50,000 population — județ, locality, street, house-number range, SIRUTA code Localitati sub 50.000 loc13,803 Locality-level (comună/oraș) — județ, locality, SIRUTA code 55,407 rows total, and every row carries a real SIRUTA code — Romania's official administrative-unit registry maintained by the National Institute of Statistics (INS), the actual ISO-3166-2-equivalent backbone for this country, not a GeoNames-internal geonameid pretending to be one.
-
Caveat that must be disclosed, not buried: this file is dated 2016 — a Last-Saved timestamp of 2016-09-02, confirmed from the file's own OLE metadata. It is 10 years stale against today. Romania's street/postal grid does not churn as fast as, say, a fast-growing city's new subdivisions, but this is still a real currency gap and must be stated plainly in any README, not smoothed over as "official" implying "current."
Recommendation — two independent decisions, not one
- Ship the GeoNames-only cleanup now — same as TH: fix the 51,032
nanliterals and the float-formattedaccuracy/admin_code2/admin_code3columns by rebuilding from the raw GeoNames source viacsv, not pandas. 903-row-scale fix pattern, just bigger (37,915 rows). Tier B, licence unambiguous (compatible, CC BY 4.0), no human decision required, available today. This is the direct RO equivalent of the TH build already shipped in commit0766502. - Evaluate the Poșta Română/SIRUTA rebuild as a genuine tier-A upgrade —
unlike TH's kongvut candidate, this one has a clean, verifiable, official
licence and no Wikipedia-provenance problem. It would take RO from
county-only granularity to street-level for every city over 50,000 people
plus all of Bucharest, with real SIRUTA admin codes throughout. The only
real cost is the 2016 staleness, which must be disclosed, and the build
work itself (three sheets with different column shapes to reconcile,
.xlsparsing, SIRUTA cross-referencing against county names). This is a bigger build than the GeoNames cleanup and should be scoped and confirmed separately before starting.
licence_status (proposed — needs human sign-off before shipping either path)
{
"channel": "postal-codes-r2",
"components": [
{
"field_group": "GeoNames-only cleanup (available today)",
"source_url": "https://download.geonames.org/export/zip/RO.zip",
"licence_id": "CC-BY-4.0",
"collected_at": "2026-08-28",
"decision": "compatible",
"decided_by": "claude-session-2026-08-28",
"decided_at": "2026-08-28"
},
{
"field_group": "PROPOSED Poșta Română / SIRUTA street-level rebuild",
"source_url": "https://data.gov.ro/dataset/coduri-postale-romania",
"licence_id": "custom:ogl-rou-1.0",
"collected_at": "2026-08-28",
"decision": "unresolved",
"decided_by": null,
"decided_at": null,
"note": "Licence itself is clean and verified (commercial reuse explicitly permitted, attribution required). Marked unresolved only because the BUILD has not been scoped/confirmed yet, not because of any licensing doubt -- flip to compatible once a human confirms the rebuild should go ahead."
}
]
}
Proposed tier
B ($49) for the GeoNames-only cleanup, matching TH. A ($99) if the Poșta Română/SIRUTA rebuild goes ahead — genuine multi-sheet, multi-granularity consolidation from an official source, a real step up from a single-source normalisation.
Final decision — 2026-08-28
Both candidates were built and validated locally (not published — see
datasets/ro/scripts/, datasets/ro/data/). The Poșta Română/SIRUTA rebuild is
the chosen product.
| GeoNames cleanup | Poșta Română / SIRUTA (chosen) | |
|---|---|---|
| Script | build_geonames_alternative.py | build_postal_codes_product.py |
| Rows | 37,915 | 54,096 (after removing 1,311 exact duplicates created by dropping the source's house-number-range field — see script docstring) |
| Granularity | County only (42/42) | Street-level for Bucureşti + every city >50,000 pop.; locality-level elsewhere |
| Admin codes | GeoNames-internal geonameids reused as admin_code2/3 | Real SIRUTA codes (Romania's official INS registry) |
| Licence | CC BY 4.0 — clean | OGL-ROU-1.0 — clean, verified verbatim, explicit commercial permission |
| Coordinates | Yes (GeoNames-estimated) | No — source carries none |
alternative_city_name | Yes, 9,054/37,915 rows | No — not populated |
| Currency | More current (GeoNames refreshes its export) | 2016 — confirmed from the source file's own OLE metadata, 10 years stale |
| Tier | B | A |
Reasoning. Granularity and official provenance won over currency and
coordinate coverage. A customer buying a Romanian postal-code dataset is far
more likely to need street-level resolution in the capital and every major
city than they are to need a lat/lon column — and SIRUTA codes are the real,
citable administrative backbone, not a GeoNames-internal ID standing in for
one. The 2016 staleness is real and is disclosed prominently in
data/README.md, data/ATTRIBUTION.txt, and the field-level schema notes —
it is a genuine limitation, not something papered over by the word "official."
What was rejected, and why it's still kept: the GeoNames cleanup is not
discarded — build_geonames_alternative.py remains a fully valid, working,
clean-licence fallback. If the SIRUTA source's staleness turns out to be
unacceptable in practice (e.g. a customer complaint about a specific
street/code that has since changed), reverting to the GeoNames path is a
same-day script run, not a re-research effort.
What was explicitly ruled out: merging the two sources onto one row (e.g. attaching GeoNames coordinates to SIRUTA rows) was considered and rejected — it would mix an OGL-sourced official register with a CC-BY aggregator re-export on the same row for a marginal benefit, adding attribution complexity without a clear customer need. Ship one clean source, not a patchwork.
Status: built and validated locally only. datasets/ro/data/{ro.csv, datapackage.json, README.md, ATTRIBUTION.txt, ro.zip} all exist and pass
Frictionless validation (valid: True). Nothing has been published to R2
and nothing has been committed to git — this final decision was reached and
recorded, but shipping it is a separate, not-yet-taken step.