# Luxembourg housing asking prices by commune and month

Release 2026.10, generated 2026-10-18T22:40:40.398Z. 858 rows in 4 tables, as CSV and Parquet. Temporal coverage: 2026-07/2026-10.

Licence: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0/) (CC-BY-4.0).

Cite as: Luxembourg housing asking prices by commune and month, ChatHome, release 2026.10. https://chathome.lu/en/data/commune-asking-prices

Asking prices per square metre of living area for apartments and houses offered for sale or rent in each of Luxembourg's 100 communes and in the 24 official quarters of Luxembourg City. Values are the median and the 25th and 75th percentiles of the residential listings that were active on ChatHome when the statistics were computed; ChatHome collects these listings from estate-agency websites. The data has four segments (sale apartment, sale house, rent apartment, rent house), a current snapshot per commune and per quarter, and a monthly history in long format that grows with each release. A median or quartile is published only when at least 5 listings support it; otherwise the cell is empty, never zero. With few listings, a median or quartile can equal a single advert's asking price per m²; the adverts are public, so this reveals no private data. For reference, the commune snapshot also carries, where available, two official Observatoire de l'Habitat series from data.public.lu: the mean asking rent over a rolling 12-month window and the mean registered apartment sale price. These differ from the ChatHome figures in statistic (mean, not median), window, source and coverage, and the registered price is a transaction figure while every other price here is an asking price. Each commune row carries the official 4-digit commune code used by STATEC and data.public.lu.

The files hold aggregates and public reference data only: no listing identifiers, descriptions, photos, addresses, listing coordinates, agency identities or user data.

## Notes on this release

- No snapshot or price-index issue exists for 2026-09; that month is absent, not interpolated.
- In commune_prices_monthly, the months 2026-07 and 2026-08 come from the monthly price-index issues: apartment sale and rent medians only, without quartiles, for communes with active listings; house segments are absent for those months.
- In commune_prices_monthly, the month 2026-10 comes from ChatHome release snapshots of all four segments, with quartiles.
- Medians and quartiles are published only for cells with at least 5 listings; smaller cells keep their sample size and carry null statistics.
- Asking statistics for Steinsel are withheld for data-quality reasons: the commune_prices_latest row is kept with null asking values and asking_price_withheld = true, and commune_prices_monthly has no rows for it.
- Sale-apartment medians are published for 81 of 100 communes.
- Sale-house medians are published for 97 of 100 communes.
- Rent-apartment medians are published for 24 of 100 communes.
- Rent-house medians are published for 3 of 100 communes.
- official_buy_apartment_eur_m2 (official mean registered apartment price) is filled for 51 of 100 communes.
- official_rent_apartment_eur_m2_month (official mean asking rent, apartments) is empty for every commune in this release.
- official_rent_house_eur_m2_month (official mean asking rent, houses) is empty for every commune in this release.
- Luxembourg City quarter statistics were computed on 2026-10-01 and count 1,135 listings with a precise point inside exactly one quarter; the commune row in commune_prices_latest (computed on 2026-10-14) counts 2,371.

## Tables

### `commune_prices_latest`: Commune asking-price snapshot

Latest sale and rental asking-price statistics per Luxembourg commune, computed from active, catalog-visible residential listings, next to labelled official reference values from the Observatoire de l'Habitat. One row per commune, including communes with no publishable sample, so absence is explicit rather than silent. Medians and quartiles are published only for cells with at least 5 listings.

- Rows: 100
- Grain: one row per Luxembourg commune, latest computation
- Source: ChatHome active-listing corpus (asking columns); official_* columns: Observatoire de l'Habitat — Ministère du Logement, via data.public.lu.

| Column | Type | Description |
| --- | --- | --- |
| `commune_code` | string | Official 4-digit Luxembourg commune code, e.g. 0304 for Luxembourg City; joins to commune_registry.commune_code. |
| `commune_slug` | string | Stable ChatHome commune identifier; joins to commune_registry.commune_slug. |
| `commune_name_en` | string | Commune name in English. |
| `canton` | string | Luxembourg canton, as a lowercase key, e.g. esch. |
| `computed_at` | string | ISO 8601 timestamp of the computation. |
| `active_listings_total` | int | Active, catalog-visible residential listings observed in the commune. Null when asking statistics are withheld. |
| `sale_apartment_sample` | int | Listings behind the sale-apartment statistics. |
| `sale_apartment_median_eur_m2` | float | Median asking price per m² for apartments for sale. Null below 5 listings. |
| `sale_apartment_p25_eur_m2` | float | 25th percentile asking price per m², apartments for sale. Null below 5 listings. |
| `sale_apartment_p75_eur_m2` | float | 75th percentile asking price per m², apartments for sale. Null below 5 listings. |
| `sale_house_sample` | int | Listings behind the sale-house statistics. |
| `sale_house_median_eur_m2` | float | Median asking price per m² for houses for sale. Null below 5 listings. |
| `sale_house_p25_eur_m2` | float | 25th percentile asking price per m², houses for sale. Null below 5 listings. |
| `sale_house_p75_eur_m2` | float | 75th percentile asking price per m², houses for sale. Null below 5 listings. |
| `rent_apartment_sample` | int | Listings behind the rental-apartment statistics. |
| `rent_apartment_median_eur_m2_month` | float | Median asking rent per m² per month, apartments. Null below 5 listings. |
| `rent_apartment_p25_eur_m2_month` | float | 25th percentile asking rent per m² per month, apartments. Null below 5 listings. |
| `rent_apartment_p75_eur_m2_month` | float | 75th percentile asking rent per m² per month, apartments. Null below 5 listings. |
| `rent_house_sample` | int | Listings behind the rental-house statistics. |
| `rent_house_median_eur_m2_month` | float | Median asking rent per m² per month, houses. Null below 5 listings. |
| `rent_house_p25_eur_m2_month` | float | 25th percentile asking rent per m² per month, houses. Null below 5 listings. |
| `rent_house_p75_eur_m2_month` | float | 75th percentile asking rent per m² per month, houses. Null below 5 listings. |
| `official_quarter` | string | Quarter in which the official rolling 12-month window ends, e.g. 2026-Q2. Every official_* value in the row covers this window; it is not a quarterly figure. |
| `official_buy_apartment_eur_m2` | float | Observatoire de l'Habitat mean registered sale price per m² of existing apartments (deeds recorded by the Publicité Foncière) over the rolling 12-month window named by official_quarter. Published only where the commune has at least 10 deeds. A transaction price, not an asking price — do not substitute one for the other. |
| `official_rent_apartment_eur_m2_month` | float | Observatoire de l'Habitat mean asking rent per m² per month for apartments, from rental adverts over the rolling 12-month window named by official_quarter. Published only where the commune has at least 30 adverts. An advertised rent, not a contracted rent. |
| `official_rent_house_eur_m2_month` | float | Observatoire de l'Habitat mean asking rent per m² per month for houses, from rental adverts over the rolling 12-month window named by official_quarter. Published only where the commune has at least 30 adverts. An advertised rent, not a contracted rent. |
| `gross_apartment_yield_pct` | float | Indicative gross yield: annualised median asking rent over median asking sale price, apartments. Null unless both medians are published. |
| `asking_price_withheld` | bool | True when ChatHome deliberately withholds this commune's asking statistics for data-quality reasons; every asking column is then null. The official_* columns may still be populated. |
| `minimum_precise_sample` | int | Listings a cell needs before its median and quartiles are published. |
| `sources` | string | Semicolon-separated source labels for the row. |

### `commune_prices_monthly`: Monthly commune asking prices

Monthly history of asking-price statistics per Luxembourg commune and segment, in long format. A month comes from ChatHome's own release snapshot of the commune statistics when one exists (all four segments, with quartiles), otherwise from the immutable monthly ChatHome price-index issue (apartment sale and rent medians only). A month with neither is absent, never interpolated. Medians and quartiles are published only for cells with at least 5 listings.

- Rows: 634
- Grain: one row per month per commune per segment
- Source: ChatHome commune price statistics (release snapshots) and ChatHome monthly price-index issues, both computed from active, catalog-visible residential listings.

| Column | Type | Description |
| --- | --- | --- |
| `month` | string | Calendar month (UTC) of the computation, YYYY-MM. |
| `commune_code` | string | Official 4-digit Luxembourg commune code; joins to commune_registry.commune_code. |
| `commune_slug` | string | Stable ChatHome commune identifier; joins to commune_registry.commune_slug. |
| `segment` | string | sale_apartment, sale_house, rent_apartment or rent_house. |
| `unit` | string | eur_per_m2 for sale segments; eur_per_m2_per_month for rent segments. |
| `sample_size` | int | Listings behind the cell. |
| `median` | float | Median asking price (sale) or asking rent (rent) per m², in the row's unit. Null below 5 listings. |
| `p25` | float | 25th percentile, in the row's unit. Null below 5 listings, and for months from the price index, which stores no quartiles. |
| `p75` | float | 75th percentile, in the row's unit. Null below 5 listings, and for months from the price index, which stores no quartiles. |
| `source` | string | release_snapshot (a ChatHome release's own snapshot of the commune statistics) or monthly_price_index (the monthly price-index issue). |
| `methodology` | string | Computation behind the row: commune-price-stats for release snapshots, price-index-<version> for price-index issues. |
| `computed_at` | string | ISO 8601 timestamp of the commune statistics computation the row comes from. |

### `city_quarter_prices_latest`: Luxembourg City quarter asking-price snapshot

Latest sale and rental asking-price statistics for the 24 official quarters of Luxembourg City, computed from active, catalog-visible residential listings. A listing counts only when it has a precise point inside exactly one official quarter polygon, so the totals are lower than the commune's in commune_prices_latest. One row per official quarter, including quarters with no publishable sample. Medians and quartiles are published only for cells with at least 5 listings.

- Rows: 24
- Grain: one row per official Luxembourg City quarter, latest computation
- Source: ChatHome active-listing corpus; quarter names, identifiers and boundaries from the Ville de Luxembourg open-data district layer.

| Column | Type | Description |
| --- | --- | --- |
| `quarter_slug` | string | Stable ChatHome quarter identifier, e.g. belair. |
| `quarter_name` | string | Official quarter name as in the Ville de Luxembourg district layer (FK_QUART_NAME, French). |
| `vdl_object_id` | int | Feature id of the quarter in the Ville de Luxembourg open-data district layer. |
| `commune_code` | string | Official 4-digit code of the commune the quarter belongs to (0304, Luxembourg City). |
| `computed_at` | string | ISO 8601 timestamp of the computation. Null when the quarter has no computed statistics. |
| `active_listings_total` | int | Active, catalog-visible residential listings with a precise point inside the quarter. |
| `sale_apartment_sample_size` | int | Listings behind the statistics for apartments for sale. |
| `sale_apartment_median` | float | Median asking price per m², apartments for sale. Null below 5 listings. |
| `sale_apartment_p25` | float | 25th percentile asking price per m², apartments for sale. Null below 5 listings. |
| `sale_apartment_p75` | float | 75th percentile asking price per m², apartments for sale. Null below 5 listings. |
| `sale_house_sample_size` | int | Listings behind the statistics for houses for sale. |
| `sale_house_median` | float | Median asking price per m², houses for sale. Null below 5 listings. |
| `sale_house_p25` | float | 25th percentile asking price per m², houses for sale. Null below 5 listings. |
| `sale_house_p75` | float | 75th percentile asking price per m², houses for sale. Null below 5 listings. |
| `rent_apartment_sample_size` | int | Listings behind the statistics for apartments for rent. |
| `rent_apartment_median` | float | Median asking rent per m² per month, apartments for rent. Null below 5 listings. |
| `rent_apartment_p25` | float | 25th percentile asking rent per m² per month, apartments for rent. Null below 5 listings. |
| `rent_apartment_p75` | float | 75th percentile asking rent per m² per month, apartments for rent. Null below 5 listings. |
| `rent_house_sample_size` | int | Listings behind the statistics for houses for rent. |
| `rent_house_median` | float | Median asking rent per m² per month, houses for rent. Null below 5 listings. |
| `rent_house_p25` | float | 25th percentile asking rent per m² per month, houses for rent. Null below 5 listings. |
| `rent_house_p75` | float | 75th percentile asking rent per m² per month, houses for rent. Null below 5 listings. |

### `commune_registry`: Luxembourg commune registry

The commune dimension every other table joins to: official commune code, ChatHome identifier, the identifiers used by the Grande Région geography and data.public.lu, names in the five ChatHome locales, and canton. Published so a reuser never has to guess how two tables line up.

- Rows: 100
- Grain: one row per Luxembourg commune
- Source: ChatHome commune registry; official commune codes from the Geoportail Luxembourg administrative limits, as used by data.public.lu.

| Column | Type | Description |
| --- | --- | --- |
| `commune_code` | string | Official 4-digit Luxembourg commune code, e.g. 0304. |
| `commune_slug` | string | Stable ChatHome commune identifier. |
| `locality_id` | string | Grande Région locality identifier, e.g. lu:lau:0304; the key used by the travel-times dataset. |
| `datapubliclu_zone` | string | data.public.lu spatial zone identifier, e.g. lu:commune:0304. |
| `commune_name_en` | string | Commune name in English. |
| `commune_name_fr` | string | Commune name in French. |
| `commune_name_de` | string | Commune name in German. |
| `commune_name_lu` | string | Commune name in Luxembourgish. |
| `commune_name_pt` | string | Commune name in Portuguese. |
| `canton` | string | Luxembourg canton, as a lowercase key, e.g. esch. |

## Thresholds and methodology

- A median, 25th or 75th percentile is published only when at least 5 listings support it; below that the value is empty, never zero. With few listings, a median or quartile can equal a single advert's asking price per m²; the adverts are public, so this reveals no private data.
- The official columns follow the Observatoire de l'Habitat's own disclosure rules: a mean asking rent needs at least 30 adverts, a mean registered apartment price at least 10 deeds.
- Listings: residential listings that are active and visible in the ChatHome catalogue at computation time. Disabled, sold, let and withdrawn listings are excluded.
- Apartments are apartment, flat, studio, penthouse and duplex listings; houses are house, townhouse, villa and bungalow listings. Living area must be 10 to 2,000 m². Sale prices outside EUR 500 to 40,000 per m² and rents outside EUR 3 to 120 per m² per month are discarded as implausible.
- A listing is assigned to a commune from the town stated on the listing; Luxembourg City quarters fold into the Luxembourg City commune in the commune tables.
- Statistics are rounded to whole euros by the commune statistics job, rents per m² per month included.
- commune_prices_monthly keeps one snapshot per month. A month with an archived release snapshot uses it for all four segments; any other month uses ChatHome's published monthly price index, which holds apartment sale and rent medians only and no quartiles. Missing months are absent, never interpolated.
- city_quarter_prices_latest counts a listing only when its precise location lies inside exactly one official Ville de Luxembourg quarter polygon.
- Commune codes are the official 4-digit codes from the national administrative boundaries; they equal the data.public.lu zones lu:commune:NNNN.
- Communes whose listing locations do not meet the publication-quality bar keep their row with asking_price_withheld = true and empty asking values.

Measurement: Median, 25th and 75th percentile of asking price per square metre of living area, computed over the residential listings active at computation time.

## Limitations: what this data is not

- Asking prices are what sellers and landlords advertise. They are not transaction prices and can differ from the price finally agreed.
- Coverage follows the listings ChatHome collects from estate-agency websites. Private sales and homes not advertised there are missing, so counts are not the size of the market.
- A change in a median between months mixes price movement with a change in the homes on offer; it is not a quality-adjusted price index.
- Small communes often have fewer than five comparable listings, so many cells are empty.
- The monthly history starts in July 2026 and has gaps; months without an archived snapshot carry apartment medians only.
- The figures are not comparable one-to-one with the Observatoire de l'Habitat or STATEC series, which use other statistics, windows and sources.

## Sources and attribution

- ChatHome listing catalogue: active residential listings collected from estate-agency websites: https://chathome.lu
- Observatoire de l'Habitat: Loyers annoncés des logements par commune: https://data.public.lu/fr/datasets/loyers-annonces-des-logements-par-commune/ (CC0 1.0)
- Observatoire de l'Habitat: Prix de vente des appartements par commune: https://data.public.lu/fr/datasets/prix-de-vente-des-appartements-par-commune/ (CC0 1.0)
- Administration du cadastre et de la topographie / Geoportail Luxembourg: Limites administratives du Grand-Duché de Luxembourg (official commune codes): https://data.public.lu/fr/datasets/limites-administratives-du-grand-duche-de-luxembourg/ (CC0 1.0)
- Ville de Luxembourg: official quarter boundaries, names and ids (open data): https://maps.vdl.lu/arcgis/rest/services/OPENDATA/GEOJSON/FeatureServer/24/query?where=1%3D1&outFields=*&outSR=4326&f=geojson (CC BY 4.0)

Credits to reproduce:

- ChatHome (https://chathome.lu), licensed under CC BY 4.0.
- Luxembourg City quarter boundaries, names and ids: Ville de Luxembourg, CC BY 4.0 (data.public.lu).
- Official columns: Observatoire de l'Habitat, via data.public.lu (CC0 1.0; credited as a courtesy).

## Files

Versioned URLs never change. Latest URLs always serve the current release.

| File | Bytes | SHA-256 | Versioned URL | Latest URL |
| --- | --- | --- | --- | --- |
| `commune_prices_latest.csv` | 20,380 | `1c2896cb96024250e61678fb174b6dde6c7253e4294464550a0270ad560f81ca` | https://chathome.lu/data/files/2026.10/commune-asking-prices/commune_prices_latest.csv | https://chathome.lu/data/files/latest/commune-asking-prices/commune_prices_latest.csv |
| `commune_prices_latest.parquet` | 12,022 | `6d5cbb8103f06ac7be05edcf8733db3a881582896315bc079341ff46206eb7fd` | https://chathome.lu/data/files/2026.10/commune-asking-prices/commune_prices_latest.parquet | https://chathome.lu/data/files/latest/commune-asking-prices/commune_prices_latest.parquet |
| `commune_prices_monthly.csv` | 79,180 | `87f3dd333790cae8dd15069ea92665782649a1de0c49b7517a281717eaaa6f09` | https://chathome.lu/data/files/2026.10/commune-asking-prices/commune_prices_monthly.csv | https://chathome.lu/data/files/latest/commune-asking-prices/commune_prices_monthly.csv |
| `commune_prices_monthly.parquet` | 9,009 | `ae53aa304833c8387d81236dc6b3e8423524e31e36b2532e6d786a24d0100ce0` | https://chathome.lu/data/files/2026.10/commune-asking-prices/commune_prices_monthly.parquet | https://chathome.lu/data/files/latest/commune-asking-prices/commune_prices_monthly.parquet |
| `city_quarter_prices_latest.csv` | 2,731 | `cc28f744e6c98532a7c0023b49184ac75bfcbd39981506a8f7c400750d3ed22b` | https://chathome.lu/data/files/2026.10/commune-asking-prices/city_quarter_prices_latest.csv | https://chathome.lu/data/files/latest/commune-asking-prices/city_quarter_prices_latest.csv |
| `city_quarter_prices_latest.parquet` | 4,669 | `907840391084ede9e2a86acb32223aecd50db7d0bf76c6b400539351bff70587` | https://chathome.lu/data/files/2026.10/commune-asking-prices/city_quarter_prices_latest.parquet | https://chathome.lu/data/files/latest/commune-asking-prices/city_quarter_prices_latest.parquet |
| `commune_registry.csv` | 10,558 | `9adedfe2a69e66c26b72680067b543def1cd01e846021572a090f9ba4e6090ca` | https://chathome.lu/data/files/2026.10/commune-asking-prices/commune_registry.csv | https://chathome.lu/data/files/latest/commune-asking-prices/commune_registry.csv |
| `commune_registry.parquet` | 9,398 | `cd0fead15c2ecf857a3eacceb4ee8e6a2a3245d0ee2f8d19c238f2de0b9e55c9` | https://chathome.lu/data/files/2026.10/commune-asking-prices/commune_registry.parquet | https://chathome.lu/data/files/latest/commune-asking-prices/commune_registry.parquet |

- `README.md` (this description): https://chathome.lu/data/files/2026.10/commune-asking-prices/README.md
- `datapackage.json` (Frictionless Tabular Data Package metadata): https://chathome.lu/data/files/2026.10/commune-asking-prices/datapackage.json

Dataset page: https://chathome.lu/en/data/commune-asking-prices. All datasets: https://chathome.lu/en/data.

## Update cadence

Released by hand, normally once a month, after the weekly commune statistics run. Each release states its date.

## Corrections

- 2026-10-18 (release 2026.10): commune_rent_price_quarterly is withdrawn. Release 2026.08 labelled it as Observatoire de l'Habitat advertised rents, but it came from ChatHome's retired rental_price_index: it carried size brackets, medians and quartiles that the Observatoire does not publish, and 4,428 of its 9,470 rows had fewer than 5 observations.
- 2026-10-18 (release 2026.10): commune_sale_price_quarterly and commune_asking_price_annual are no longer published. They copied official Observatoire de l'Habitat series that could not be rebuilt reproducibly: the history is no longer stored and the stored commune codes were not the official ones. Use the originals on data.public.lu (CC0).
- 2026-10-18 (release 2026.10): frontalier_belt_communes (2,321 French communes) and cross_border_source_status are withdrawn. travel_time_localities in the travel-times dataset covers only the French and German travel-time reference communes, with official codes, names and IGSS cross-border worker counts, and carries no population or postal codes.
- 2026-10-18 (release 2026.10): Release 2026.08 published 25th and 75th percentiles in commune_prices_latest for 57 cells (in 50 communes) with only 2 to 4 observations. Quartiles are now empty below 5 observations.
- 2026-10-18 (release 2026.10): commune_name_lu in commune_registry was empty in release 2026.08. It is now filled.
- 2026-10-18 (release 2026.10): Release 2026.08 said the data was regenerated monthly. No later release was produced before this one; releases are now run by hand and each one states its date.

## Contact

ChatHome, https://chathome.lu, hello@chathome.lu
