HMS - Húsnæðis- og mannvirkjastofnun

SkillDev tools

HMS — kaupskrá fasteigna (222k transactions), landeignaskrá parcels, kaup/leiguvísitala price-rent indices, húsnæðisáætlanir housing plans.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the HMS - Húsnæðis- og mannvirkjastofnun skill

What this skill tells your AI

The instructions your AI receives, as published by jokull/icelandic-data in .agents/skills/hms/SKILL.md and read by ahel’s review.

Property registry and housing market data from Iceland's Housing and Construction Authority.

Data Sources

Kaupskrá fasteigna (Property Purchase Registry)

URL: https://frs3o1zldvgn.objectstorage.eu-frankfurt-1.oci.customer-oci.com/n/frs3o1zldvgn/b/public_data_for_download/o/kaupskra.csv

Format: CSV (semicolon delimited, ISO-8859-1 encoded)

Local file: data/raw/hms/kaupskra_utf8.csv — the raw download re-decoded to UTF-8. Fetch + convert + freshness report with scripts/kaupskra_fetch.py:

uv run python scripts/kaupskra_fetch.py          # download, convert Latin-1→UTF-8, report
uv run python scripts/kaupskra_fetch.py report   # re-report an existing copy

The download is staged, decoded and schema-checked before replacing the UTF-8 copy. Original Latin-1 bytes are retained in data/raw/hms/kaupskra.csv. The script prints the row count and newest THINGLYSTDAGS — if the newest is months old, refresh.

Update frequency: Daily

Coverage: 2006-present, ~222k transactions

Key Fields
FieldTypeDescription
faerslunumerintUnique transaction ID
fastnumstrProperty number
heimilisfangstrAddress
postnrintPostal code
heinumintLocation ID (7-digit, different from iceaddr hnitnum)
svfnstrMunicipality code
sveitarfelagstrMunicipality name
utgdagdatePurchase agreement date
thinglystdagstimestampRegistration date
kaupverdintPurchase price (in thousands of ISK)
fasteignamatintProperty valuation at sale (thousands)
fasteignamat_gildandiintCurrent property valuation (thousands)
brunabotamat_gildandiintFire insurance value (thousands)
byggarintYear built
einflmfloatUnit area (m²)
lod_flmfloatLot area
fjherbintNumber of rooms
tegundstrProperty type: Sérbýli, Fjölbýli, Sumarhús, Atvinnuhúsnæði, etc
fullbuidboolWhether property is complete
onothaefur_samningurboolUnusable for analysis (related party, multiple properties, etc)
Caveats
  • Prices in thousands: kaupverd=57000 means 57,000,000 ISK
  • heinum ≠ hnitnum: Cannot join directly to iceaddr, use address+postnr instead
  • onothaefur_samningur: Filter these for market analysis (related party sales, partial transfers)

Geocoding with iceaddr

The heinum field does NOT match iceaddr's hnitnum. Join on parsed address components:

-- Parse address from kaupskra
TRIM(regexp_extract(HEIMILISFANG, '^([^0-9]+)', 1)) as street_name,
TRY_CAST(regexp_extract(HEIMILISFANG, '([0-9]+)', 1) AS INTEGER) as house_num,
upper(regexp_extract(HEIMILISFANG, '[0-9]+([a-zA-Z]?)$', 1)) as house_letter

-- Join to iceaddr.stadfong
ON lower(street_name) = lower(heiti_nf)
AND house_num = husnr
AND postnr = postnr
AND house_letter = COALESCE(upper(bokst), '')

Match rate: ~97%

Processed Data

Location: /data/processed/kaupskra_geocoded.parquet

Includes all kaupskra fields plus:

  • lat, lng - WGS84 coordinates from iceaddr
  • verd_per_m2 - Price per m² (in ISK, not thousands)

Quick Queries

# Summary stats
duckdb -c "SELECT count(*), count(lat), median(kaupverd*1000/einflm_m2) FROM 'data/processed/kaupskra_geocoded.parquet' WHERE NOT onothaefur AND tegund='Fjölbýli'"

# Recent Reykjavík sales
duckdb -c "SELECT heimilisfang, kaupverd*1000 as kr, einflm_m2 FROM 'data/processed/kaupskra_geocoded.parquet' WHERE postnr BETWEEN 101 AND 128 AND kaupsamningur_dags >= '2024-01-01' ORDER BY kaupsamningur_dags DESC LIMIT 20"

Landeignaskrá (Land Parcel Registry)

Landing page (Vercel-guarded, Icelandic): https://hms.is/gogn-og-maelabord/grunngogntilnidurhals/landeignaskrazip Bulk ZIP (Azure blob, no auth): https://hmsstgsftpprodweu001.blob.core.windows.net/fasteignaskra/Landeignaskra.zip Field descriptions PDF: linked from the landing page as "Eigindalýsing".

~25 MB ZIP containing a single ESRI Shapefile (LANDEIGNASKRA_AFHENDING.*) with 89,050 parcels in CRS EPSG:3057 (ISN2016 Lambert). Script: scripts/landeignaskra.py (download, extract, info, build, lookup, discover).

Schema

ColumnMeaning
LANDE_NRLandsnúmer (parcel ID, 6–7 digit integer; keep leading zeros when expressing as 7-char)
SVF_NRMunicipality number
GERDType — Lóð (85,060 lots), Jörð (3,443 farms), Þjóðlenda (270 public)
SKIKI_NR, SKIKI_AUDKSub-parcel ID and share code (e.g. "1/1", "4/277")
L_ST_SKRAD / L_ST_MAELDRegistered vs. measured area
DAGS_INN, DAGS_LEIDRRegistration / last-correction dates
GERD, ADFERD_INN, NAKVAEMNI, HEIMILDProvenance metadata

The processed CSV (data/processed/landeignaskra.csv) adds landsnr (7-char zero-padded), lon, lat (WGS84 centroids).

Encoding

The .dbf file is ISO-8859-1; pyogrio / geopandas will read it as Latin-1 and surface text as mojibake (Lóð for Lóð). Either decode with ISO-8859-1 explicitly or accept that the GERD / Icelandic text columns are cosmetic.

Crosswalks from other registries

Source IDLengthConvert to landsnúmer
búsnúmer (farm ID, Ministry of Agriculture — see maelabord_landbunadarins)8 digits (displayed as 7 after leading-zero strip)int(busnr) // 10

Example: búsnúmer 16656491 (Gunnbjarnarholt 2, top cattle recipient 2026) → landsnúmer 1665649. Caveat: only ~3,443 of the 89k Landeignaskrá parcels are GERD='Jörð'; many active farm búsnúmer correspond to landnúmer that exist in iceaddr's Staðfangaskrá (~138k landnúmer, including historical farms) but not yet in HMS's surveyed registry. For farm point-location, iceaddr is the practical primary source; Landeignaskrá gives you parcel polygons when you need them.

Mælaborð íbúða í byggingu (Units Under Construction)

Landing page: https://hms.is/gogn-og-maelabord/maelabord-ibuda-i-byggingu Report page: https://hms.is/skyrslur/ibudir-i-byggingu

Interactive dashboard + Iceland map showing every dwelling currently under construction, updated in real-time from HMS's building registry (byggingaskrá). Launched mid-2024. Used by municipalities, contractors, lenders, real-estate agents.

Most recent counts (March 2025): 7,181 units under construction, 69.7% in the capital region.

Scope: Per-unit location, construction stage, municipality, project.

Access:

  • Interactive dashboard (HTML + Leaflet map) on the landing page.
  • Published reports (PDF) linked from /skyrslur/ibudir-i-byggingu.
  • No public API or raw data download — the Hagtalnanefnd report (March 2026) specifically flags this as an example of HMS publishing "aðeins mælaborð eða skýrslur" (only dashboards and reports), with raw data not accessible under law 45/2018.

Scraping notes:

  • hms.is is fronted by Vercel with an anti-bot checkpoint. curl and httpx get the "Vercel Security Checkpoint" HTML. Use Playwright (headless Chromium) to bypass.
  • The dashboard fetches JSON from internal /api/... endpoints — inspect via DevTools Network tab while Playwright has the page loaded. Pattern similar to landlaeknir scraper but the source is custom (not Power BI).

Complementary sources:

  • hagstofan table FAS01302 — completed dwellings by year (historical, not real-time).
  • skipulagsmal — Planitor building-permit data (case-level, 5 municipalities).

Kaupvísitala og Leiguvísitala (Price & Rent Indices)

The visitala page (https://hms.is/gogn-og-maelabord/visitolur) is behind a Vercel anti-bot checkpoint, so curl/httpx get the challenge HTML. Do not scrape it — the two CSVs it links sit on public object storage and fetch directly:

  • https://frs3o1zldvgn.objectstorage.eu-frankfurt-1.oci.customer-oci.com/n/frs3o1zldvgn/b/public_data_for_download/o/kaupvisitala.csv
  • https://frs3o1zldvgn.objectstorage.eu-frankfurt-1.oci.customer-oci.com/n/frs3o1zldvgn/b/public_data_for_download/o/leiguvisitala.csv

scripts/hms_indices.py downloads them (fetch) and builds the merged rebased index (process, bare run):

uv run python scripts/hms_indices.py fetch    # → data/raw/hms/indices/{kaup,leigu}visitala.csv
uv run python scripts/hms_indices.py          # → data/processed/hms_rent_vs_price_index.csv

Columns: UTGAFUDAGUR (publication date — blank on old kaupvísitala rows), AR, MANUDUR, VISITALA, then regional splits. The kaupvísitala file has regional breakdowns; the leiguvísitala CSV is national only. Note the monthly publication cadence: the newest UTGAFUDAGUR can lag a month or two.

Húsnæðisáætlanir (Housing Plans)

Annual published workbook with the authoritative housing-policy numbers: completions vs the HMS "real need" band, non-market rental waitlists by category, and buildable-plot availability by region. Sheet map:

SheetContents
2.1Annual completions + forecast band (Miðspá / Spábil neðri/efri mörk), all Iceland
3.1 / 3.2"Real need" lower/upper bounds, national and capital area
4.2Plot availability ratio to the labelled need year, by region
5.2Non-market rental waitlists by category, by year

Source page: https://hms.is/skyrslur/husnaedisaaetlanir (the annual workbook husnaedisaaetlanir_<year>_gogn.xlsx is linked here, but the page is Vercel-guarded — download by hand into data/raw/hms/). The script parses the workbook into three processed CSVs:

uv run python scripts/hms_housing_plans.py            # parse the newest local workbook
uv run python scripts/hms_housing_plans.py --year 2026
uv run python scripts/hms_housing_plans.py list       # what workbooks are local

Outputs: data/processed/hms_husnaedisaaetlanir_{completions_vs_need, nonmarket_rental_waitlist,plot_availability_by_region}.csv. Sheet 2.1's completed-dwellings feed scripts/housing_completions.py automatically (it reads observed counts from the parsed CSV, retaining historical reference counts for years absent from a newer workbook). Forecast-only rows are not completions. Plot output includes need_year, taken from the sheet header. The workbook remains a manual input; these changes do not automate discovery or downloading of future annual reports.

License

Open data, attribution required: "Byggir á upplýsingum frá Húsnæðis- og mannvirkjastofnun"

Related

Public CSV download CLI

scripts/hms_public.py kaupvisitala|leiguvisitala|kaupskra --out /path/output.csv downloads public object-storage files and archives original bytes by hash. Index CSVs are UTF-8; purchase registry is converted from ISO-8859-1. This does not apply market filters or infer completed/unsold housing.

Signals

GitHub stars
53
Forks
4
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
hms
Source
github.com/jokull/icelandic-data