# Advertised homes and asking prices by energy class, Luxembourg and border regions

Release 2026.10, generated 2026-10-18T22:40:40.398Z. 420 rows in 2 tables, as CSV and Parquet. Temporal coverage: 2026-10-18.

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

Cite as: Advertised homes and asking prices by energy class, Luxembourg and border regions, ChatHome, release 2026.10. https://chathome.lu/en/data/energy-class-asking-prices

How the homes advertised for sale and for rent in Luxembourg and in the neighbouring areas of France, Belgium (Wallonia) and Germany are distributed across energy-performance classes, and what they ask per square metre in each class. Each country keeps its own certificate scheme and headline indicator: the Luxembourg CPE primary-energy class (A+ to I), the French DPE energy-consumption class (A to G), the Walloon PEB class (A++ to G) and the German Energieausweis class (A+ to H). Letters are never pooled or converted across schemes. A listing whose class is missing, on another axis or outside its scheme's scale counts as not stated, and not-stated rows are published so the gap stays visible. The source is a one-day snapshot of the public ChatHome catalogue of active listings, which ChatHome collects from estate-agency websites. Counts and shares need at least 5 listings, because smaller counts are unreliable; the adverts are public and this is not a confidentiality guarantee, as a hidden count can sometimes be worked out from the shares. Median, 25th and 75th percentile asking prices per m² and new-build shares need at least 10. A second table gives the class mix by Luxembourg canton. The shares describe advertised stock on the snapshot date. They are not the national certificate registers and not the housing stock.

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

- Snapshot of 2026-10-18: 12,608 apartments and houses were classified. Listings stating a class on their country's headline scale: Luxembourg 6,149 of 9,888, France 1,002 of 1,704, Belgium 351 of 503, Germany 246 of 513.
- 42.6% of the 2,868 Luxembourg class-A listings (LU CPE primary energy) are new builds, under construction, planned or part of a multi-unit project.
- Shares describe advertised stock, the homes listed on ChatHome on the snapshot date, not the housing stock.
- Energy-class letters are not comparable across countries: each country's certificate has its own scale and indicator and no crosswalk exists, so classes are never pooled or ranked across schemes.
- 1,167 of the 12,608 classified listings have no price per m² inside the plausibility bands (price or area missing, or outside the bands); they count in class shares but not in price statistics.
- 723 of the public listings have an older card body and were left out, because their energy scheme was assumed from the country rather than read from a certificate.

## Tables

### `energy_class_asking_prices`: Advertised homes and asking prices by energy class

Apartments (studios included) and houses advertised for sale or rent on the snapshot date, by country, tenure, property type and energy-performance class, with each class's share and its asking price per m². The class is the one each country's certificate states on its headline scale: Luxembourg CPE primary energy, French DPE energy consumption, Walloon PEB overall performance, German Energieausweis overall performance. Values on another indicator or off the scheme's scale count as not_stated. Letters are not comparable across countries. Rooms, colocations, multi-unit buildings and land are excluded. Price per m² is the asking price (or monthly base rent) divided by the living area, kept only for areas of 10–2,000 m², sale prices of 500–40,000 EUR/m² and rents of 3–120 EUR/m² a month; listings outside these bands still count in class shares, because their class is known, but not in price statistics. Asking prices are not transaction prices. Every class of the scale and not_stated is listed for each country, tenure and type with at least one listing, so absence is explicit.

- Rows: 156
- Grain: one row per country × tenure × property type × energy class (every class of the country's scale, plus not_stated)
- Source: ChatHome public listing catalog: active, publicly listed adverts with a V3 card body. Energy classes are the certificate facets read from each advert.

| Column | Type | Description |
| --- | --- | --- |
| `snapshot_date` | string | Date the catalog was read (YYYY-MM-DD, UTC). |
| `country` | string | ISO country of the home: LU, FR, BE or DE. |
| `energy_scheme` | string | Certificate scheme: LU_CPE, FR_DPE, BE_WAL_PEB or DE_ENERGIEAUSWEIS. |
| `indicator` | string | The scheme's headline indicator used for the class: primary_energy (LU), energy_consumption (FR), overall_performance (BE, DE). |
| `tenure` | string | sale or rent. |
| `property_type` | string | apartment (studios included) or house. |
| `energy_class` | string | Class label on the scheme's own scale, or not_stated when the advert states no class on the headline indicator, states one off the scale, or states two different ones. |
| `class_rank` | int | Position on the scheme's own scale, 0 = best. Comparable only within one scheme. Null for not_stated. |
| `listings` | int | Listings in this cell. Null when fewer than 5, because such small counts are unreliable (the row is then suppressed). |
| `share_of_listings_pct` | float | Share of this class among all listings of the same country, tenure and property type, not_stated included, in percent (1 decimal). Null when suppressed. |
| `share_of_stated_pct` | float | Share of this class among the listings of the same country, tenure and property type that state a class, in percent (1 decimal). Null for not_stated and when suppressed. |
| `new_build_share_pct` | float | Share of the cell's listings that are new builds, under construction, planned, or units of a multi-unit project, in percent (1 decimal). Null when fewer than 10 listings. |
| `price_listings` | int | Listings of the cell with a price per m² inside the plausibility bands. Null when fewer than 10. |
| `unit` | string | Unit of median, p25 and p75: eur_per_m2 (sale) or eur_per_m2_per_month (rent). |
| `median` | float | Median asking price per m² of the price listings. Sale rounded to whole euros, rent to 0.1 euro. Null unless price_listings is at least 10. |
| `p25` | float | 25th percentile of asking price per m² (linear interpolation). Null unless price_listings is at least 10. |
| `p75` | float | 75th percentile of asking price per m² (linear interpolation). Null unless price_listings is at least 10. |
| `suppressed` | bool | True when the cell has fewer than 5 listings: its counts, shares and prices are then null, because such small counts are unreliable. The adverts are public and this is not a confidentiality guarantee: a hidden count can sometimes be worked out from the shares. |

### `canton_energy_class_mix`: Energy-class mix of advertised homes by Luxembourg canton

Share of each Luxembourg CPE primary-energy class among the apartments (studios included) and houses advertised for sale or rent on the snapshot date, per canton. The canton comes from the listing's official commune (STATEC locality id). Rooms, colocations, multi-unit buildings and land are excluded. Shares describe advertised stock, not the housing stock. Every class of the scale and not_stated is listed for each canton and tenure with at least one listing.

- Rows: 264
- Grain: one row per Luxembourg canton × tenure × energy class (every LU CPE class, plus not_stated)
- Source: ChatHome public listing catalog: active, publicly listed adverts with a V3 card body. Energy classes are the certificate facets read from each advert.

| Column | Type | Description |
| --- | --- | --- |
| `snapshot_date` | string | Date the catalog was read (YYYY-MM-DD, UTC). |
| `canton` | string | Canton key of the ChatHome commune registry, e.g. esch (joins commune_registry.canton). |
| `canton_name` | string | Official canton name, e.g. Esch-sur-Alzette. |
| `tenure` | string | sale or rent. |
| `energy_class` | string | LU CPE primary-energy class (A+ to I), or not_stated when the advert states none on that indicator, one off the scale, or two different ones. |
| `listings` | int | Listings in this cell. Null when fewer than 5, because such small counts are unreliable (the row is then suppressed). |
| `share_of_listings_pct` | float | Share of this class among all listings of the canton and tenure, not_stated included, in percent (1 decimal). Null when suppressed. |
| `suppressed` | bool | True when the cell has fewer than 5 listings: its count and share are then null, because such small counts are unreliable. The adverts are public and this is not a confidentiality guarantee: a hidden count can sometimes be worked out from the shares. |

## Thresholds and methodology

- Listing counts and shares are published when at least 5 listings support them; below that the cell shows no count or share and suppressed = true, because such small counts are unreliable. The underlying adverts are public, and this rule is not a confidentiality guarantee: a hidden count can sometimes be worked out from the shares of the other cells in its group.
- Median, 25th and 75th percentile prices need at least 10 listings inside the price bands; the new-build share needs at least 10 listings.
- Snapshot of the public ChatHome catalogue on the snapshot date: listings that are active and catalogue-eligible, restricted to records produced by the current listing pipeline.
- Headline class per country: Luxembourg CPE primary_energy, France DPE energy_consumption, Wallonia PEB overall_performance, Germany Energieausweis overall_performance. Any other axis, an empty class or a letter outside the scheme's scale counts as not_stated; nothing is coerced.
- class_rank orders classes within their own scheme only (0 = best); there is no crosswalk between countries.
- Apartments and studios form the apartment type and houses the house type. Rooms, colocations, multi-unit buildings and land are excluded.
- Price per m² is the asking price (or monthly rent) divided by living area. Listings with living area outside 10 to 2,000 m², sale prices outside EUR 500 to 40,000 per m² or rents outside EUR 3 to 120 per m² per month are left out of the price statistics but still count in the class shares.
- A listing counts as new build when it is marked new build, under construction or planned, or belongs to a multi-unit development.
- canton_energy_class_mix assigns Luxembourg listings to the canton of their commune through the official commune code.

Measurement: Counts and shares of active advertised listings by stated energy-performance class, and median, 25th and 75th percentile asking price per square metre of living area within each class.

## Limitations: what this data is not

- Shares describe homes advertised on the snapshot date, not the housing stock and not the national certificate registers.
- Many adverts state no class; the not_stated rows show how many.
- Letters are not comparable across countries: each scheme has its own scale and its own thresholds.
- A price difference between classes mixes energy performance with age, size and location: new builds can make up much of the best classes, and each release's notes give the measured new-build share of Luxembourg class A.
- Coverage outside Luxembourg is limited to the areas near the border where ChatHome collects listings.
- Asking prices are not transaction prices.

## Sources and attribution

- ChatHome public listing catalogue: active residential listings collected from estate-agency websites: https://chathome.lu
- 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)

Credits to reproduce:

- ChatHome (https://chathome.lu), licensed under CC BY 4.0.

## Files

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

| File | Bytes | SHA-256 | Versioned URL | Latest URL |
| --- | --- | --- | --- | --- |
| `energy_class_asking_prices.csv` | 16,486 | `c4ed99a3f8731f66cfb14545659180a7a4b56d26605bbb625a0d96a7c887cd43` | https://chathome.lu/data/files/2026.10/energy-class-asking-prices/energy_class_asking_prices.csv | https://chathome.lu/data/files/latest/energy-class-asking-prices/energy_class_asking_prices.csv |
| `energy_class_asking_prices.parquet` | 5,990 | `ff806a668d790ba800e2ce39cc550f42295ba6847098f5c26deb6ad9adcbbe4d` | https://chathome.lu/data/files/2026.10/energy-class-asking-prices/energy_class_asking_prices.parquet | https://chathome.lu/data/files/latest/energy-class-asking-prices/energy_class_asking_prices.parquet |
| `canton_energy_class_mix.csv` | 12,564 | `33f6cf08fec67bf3a24c1c70eba116ed6ed2b784b958d157fcf7651d6cbe8e97` | https://chathome.lu/data/files/2026.10/energy-class-asking-prices/canton_energy_class_mix.csv | https://chathome.lu/data/files/latest/energy-class-asking-prices/canton_energy_class_mix.csv |
| `canton_energy_class_mix.parquet` | 2,681 | `71eb319ad5880f72c9b5c9d9b0c3369994f550daab3459d1a1cc4100fef6e3f7` | https://chathome.lu/data/files/2026.10/energy-class-asking-prices/canton_energy_class_mix.parquet | https://chathome.lu/data/files/latest/energy-class-asking-prices/canton_energy_class_mix.parquet |

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

Dataset page: https://chathome.lu/en/data/energy-class-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
