{
  "profile": "tabular-data-package",
  "name": "commune-asking-prices",
  "title": "Luxembourg housing asking prices by commune and month",
  "description": "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.",
  "version": "2026.10",
  "created": "2026-10-18T22:40:40.398Z",
  "homepage": "https://chathome.lu/en/data/commune-asking-prices",
  "licenses": [
    {
      "name": "CC-BY-4.0",
      "path": "https://creativecommons.org/licenses/by/4.0/",
      "title": "Creative Commons Attribution 4.0 International"
    }
  ],
  "contributors": [
    {
      "title": "ChatHome",
      "role": "publisher",
      "path": "https://chathome.lu",
      "email": "hello@chathome.lu"
    }
  ],
  "sources": [
    {
      "title": "ChatHome listing catalogue: active residential listings collected from estate-agency websites",
      "path": "https://chathome.lu"
    },
    {
      "title": "Observatoire de l'Habitat: Loyers annoncés des logements par commune (CC0 1.0)",
      "path": "https://data.public.lu/fr/datasets/loyers-annonces-des-logements-par-commune/"
    },
    {
      "title": "Observatoire de l'Habitat: Prix de vente des appartements par commune (CC0 1.0)",
      "path": "https://data.public.lu/fr/datasets/prix-de-vente-des-appartements-par-commune/"
    },
    {
      "title": "Administration du cadastre et de la topographie / Geoportail Luxembourg: Limites administratives du Grand-Duché de Luxembourg (official commune codes) (CC0 1.0)",
      "path": "https://data.public.lu/fr/datasets/limites-administratives-du-grand-duche-de-luxembourg/"
    },
    {
      "title": "Ville de Luxembourg: official quarter boundaries, names and ids (open data) (CC BY 4.0)",
      "path": "https://maps.vdl.lu/arcgis/rest/services/OPENDATA/GEOJSON/FeatureServer/24/query?where=1%3D1&outFields=*&outSR=4326&f=geojson"
    }
  ],
  "keywords": [
    "Luxembourg",
    "housing",
    "asking prices",
    "advertised rents",
    "price per square metre",
    "commune",
    "Luxembourg City quarters",
    "real estate",
    "open data"
  ],
  "resources": [
    {
      "name": "commune_prices_latest",
      "path": "commune_prices_latest.csv",
      "title": "Commune asking-price snapshot",
      "description": "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. Grain: one row per Luxembourg commune, latest computation.",
      "profile": "tabular-data-resource",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 20380,
      "hash": "sha256:1c2896cb96024250e61678fb174b6dde6c7253e4294464550a0270ad560f81ca",
      "schema": {
        "fields": [
          {
            "name": "commune_code",
            "type": "string",
            "description": "Official 4-digit Luxembourg commune code, e.g. 0304 for Luxembourg City; joins to commune_registry.commune_code."
          },
          {
            "name": "commune_slug",
            "type": "string",
            "description": "Stable ChatHome commune identifier; joins to commune_registry.commune_slug."
          },
          {
            "name": "commune_name_en",
            "type": "string",
            "description": "Commune name in English."
          },
          {
            "name": "canton",
            "type": "string",
            "description": "Luxembourg canton, as a lowercase key, e.g. esch."
          },
          {
            "name": "computed_at",
            "type": "string",
            "description": "ISO 8601 timestamp of the computation."
          },
          {
            "name": "active_listings_total",
            "type": "integer",
            "description": "Active, catalog-visible residential listings observed in the commune. Null when asking statistics are withheld."
          },
          {
            "name": "sale_apartment_sample",
            "type": "integer",
            "description": "Listings behind the sale-apartment statistics."
          },
          {
            "name": "sale_apartment_median_eur_m2",
            "type": "number",
            "description": "Median asking price per m² for apartments for sale. Null below 5 listings."
          },
          {
            "name": "sale_apartment_p25_eur_m2",
            "type": "number",
            "description": "25th percentile asking price per m², apartments for sale. Null below 5 listings."
          },
          {
            "name": "sale_apartment_p75_eur_m2",
            "type": "number",
            "description": "75th percentile asking price per m², apartments for sale. Null below 5 listings."
          },
          {
            "name": "sale_house_sample",
            "type": "integer",
            "description": "Listings behind the sale-house statistics."
          },
          {
            "name": "sale_house_median_eur_m2",
            "type": "number",
            "description": "Median asking price per m² for houses for sale. Null below 5 listings."
          },
          {
            "name": "sale_house_p25_eur_m2",
            "type": "number",
            "description": "25th percentile asking price per m², houses for sale. Null below 5 listings."
          },
          {
            "name": "sale_house_p75_eur_m2",
            "type": "number",
            "description": "75th percentile asking price per m², houses for sale. Null below 5 listings."
          },
          {
            "name": "rent_apartment_sample",
            "type": "integer",
            "description": "Listings behind the rental-apartment statistics."
          },
          {
            "name": "rent_apartment_median_eur_m2_month",
            "type": "number",
            "description": "Median asking rent per m² per month, apartments. Null below 5 listings."
          },
          {
            "name": "rent_apartment_p25_eur_m2_month",
            "type": "number",
            "description": "25th percentile asking rent per m² per month, apartments. Null below 5 listings."
          },
          {
            "name": "rent_apartment_p75_eur_m2_month",
            "type": "number",
            "description": "75th percentile asking rent per m² per month, apartments. Null below 5 listings."
          },
          {
            "name": "rent_house_sample",
            "type": "integer",
            "description": "Listings behind the rental-house statistics."
          },
          {
            "name": "rent_house_median_eur_m2_month",
            "type": "number",
            "description": "Median asking rent per m² per month, houses. Null below 5 listings."
          },
          {
            "name": "rent_house_p25_eur_m2_month",
            "type": "number",
            "description": "25th percentile asking rent per m² per month, houses. Null below 5 listings."
          },
          {
            "name": "rent_house_p75_eur_m2_month",
            "type": "number",
            "description": "75th percentile asking rent per m² per month, houses. Null below 5 listings."
          },
          {
            "name": "official_quarter",
            "type": "string",
            "description": "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."
          },
          {
            "name": "official_buy_apartment_eur_m2",
            "type": "number",
            "description": "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."
          },
          {
            "name": "official_rent_apartment_eur_m2_month",
            "type": "number",
            "description": "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."
          },
          {
            "name": "official_rent_house_eur_m2_month",
            "type": "number",
            "description": "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."
          },
          {
            "name": "gross_apartment_yield_pct",
            "type": "number",
            "description": "Indicative gross yield: annualised median asking rent over median asking sale price, apartments. Null unless both medians are published."
          },
          {
            "name": "asking_price_withheld",
            "type": "boolean",
            "description": "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."
          },
          {
            "name": "minimum_precise_sample",
            "type": "integer",
            "description": "Listings a cell needs before its median and quartiles are published."
          },
          {
            "name": "sources",
            "type": "string",
            "description": "Semicolon-separated source labels for the row."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "commune_prices_latest_parquet",
      "path": "commune_prices_latest.parquet",
      "title": "Commune asking-price snapshot (Parquet)",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 12022,
      "hash": "sha256:6d5cbb8103f06ac7be05edcf8733db3a881582896315bc079341ff46206eb7fd"
    },
    {
      "name": "commune_prices_monthly",
      "path": "commune_prices_monthly.csv",
      "title": "Monthly commune asking prices",
      "description": "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. Grain: one row per month per commune per segment.",
      "profile": "tabular-data-resource",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 79180,
      "hash": "sha256:87f3dd333790cae8dd15069ea92665782649a1de0c49b7517a281717eaaa6f09",
      "schema": {
        "fields": [
          {
            "name": "month",
            "type": "string",
            "description": "Calendar month (UTC) of the computation, YYYY-MM."
          },
          {
            "name": "commune_code",
            "type": "string",
            "description": "Official 4-digit Luxembourg commune code; joins to commune_registry.commune_code."
          },
          {
            "name": "commune_slug",
            "type": "string",
            "description": "Stable ChatHome commune identifier; joins to commune_registry.commune_slug."
          },
          {
            "name": "segment",
            "type": "string",
            "description": "sale_apartment, sale_house, rent_apartment or rent_house."
          },
          {
            "name": "unit",
            "type": "string",
            "description": "eur_per_m2 for sale segments; eur_per_m2_per_month for rent segments."
          },
          {
            "name": "sample_size",
            "type": "integer",
            "description": "Listings behind the cell."
          },
          {
            "name": "median",
            "type": "number",
            "description": "Median asking price (sale) or asking rent (rent) per m², in the row's unit. Null below 5 listings."
          },
          {
            "name": "p25",
            "type": "number",
            "description": "25th percentile, in the row's unit. Null below 5 listings, and for months from the price index, which stores no quartiles."
          },
          {
            "name": "p75",
            "type": "number",
            "description": "75th percentile, in the row's unit. Null below 5 listings, and for months from the price index, which stores no quartiles."
          },
          {
            "name": "source",
            "type": "string",
            "description": "release_snapshot (a ChatHome release's own snapshot of the commune statistics) or monthly_price_index (the monthly price-index issue)."
          },
          {
            "name": "methodology",
            "type": "string",
            "description": "Computation behind the row: commune-price-stats for release snapshots, price-index-<version> for price-index issues."
          },
          {
            "name": "computed_at",
            "type": "string",
            "description": "ISO 8601 timestamp of the commune statistics computation the row comes from."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "commune_prices_monthly_parquet",
      "path": "commune_prices_monthly.parquet",
      "title": "Monthly commune asking prices (Parquet)",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 9009,
      "hash": "sha256:ae53aa304833c8387d81236dc6b3e8423524e31e36b2532e6d786a24d0100ce0"
    },
    {
      "name": "city_quarter_prices_latest",
      "path": "city_quarter_prices_latest.csv",
      "title": "Luxembourg City quarter asking-price snapshot",
      "description": "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. Grain: one row per official Luxembourg City quarter, latest computation.",
      "profile": "tabular-data-resource",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 2731,
      "hash": "sha256:cc28f744e6c98532a7c0023b49184ac75bfcbd39981506a8f7c400750d3ed22b",
      "schema": {
        "fields": [
          {
            "name": "quarter_slug",
            "type": "string",
            "description": "Stable ChatHome quarter identifier, e.g. belair."
          },
          {
            "name": "quarter_name",
            "type": "string",
            "description": "Official quarter name as in the Ville de Luxembourg district layer (FK_QUART_NAME, French)."
          },
          {
            "name": "vdl_object_id",
            "type": "integer",
            "description": "Feature id of the quarter in the Ville de Luxembourg open-data district layer."
          },
          {
            "name": "commune_code",
            "type": "string",
            "description": "Official 4-digit code of the commune the quarter belongs to (0304, Luxembourg City)."
          },
          {
            "name": "computed_at",
            "type": "string",
            "description": "ISO 8601 timestamp of the computation. Null when the quarter has no computed statistics."
          },
          {
            "name": "active_listings_total",
            "type": "integer",
            "description": "Active, catalog-visible residential listings with a precise point inside the quarter."
          },
          {
            "name": "sale_apartment_sample_size",
            "type": "integer",
            "description": "Listings behind the statistics for apartments for sale."
          },
          {
            "name": "sale_apartment_median",
            "type": "number",
            "description": "Median asking price per m², apartments for sale. Null below 5 listings."
          },
          {
            "name": "sale_apartment_p25",
            "type": "number",
            "description": "25th percentile asking price per m², apartments for sale. Null below 5 listings."
          },
          {
            "name": "sale_apartment_p75",
            "type": "number",
            "description": "75th percentile asking price per m², apartments for sale. Null below 5 listings."
          },
          {
            "name": "sale_house_sample_size",
            "type": "integer",
            "description": "Listings behind the statistics for houses for sale."
          },
          {
            "name": "sale_house_median",
            "type": "number",
            "description": "Median asking price per m², houses for sale. Null below 5 listings."
          },
          {
            "name": "sale_house_p25",
            "type": "number",
            "description": "25th percentile asking price per m², houses for sale. Null below 5 listings."
          },
          {
            "name": "sale_house_p75",
            "type": "number",
            "description": "75th percentile asking price per m², houses for sale. Null below 5 listings."
          },
          {
            "name": "rent_apartment_sample_size",
            "type": "integer",
            "description": "Listings behind the statistics for apartments for rent."
          },
          {
            "name": "rent_apartment_median",
            "type": "number",
            "description": "Median asking rent per m² per month, apartments for rent. Null below 5 listings."
          },
          {
            "name": "rent_apartment_p25",
            "type": "number",
            "description": "25th percentile asking rent per m² per month, apartments for rent. Null below 5 listings."
          },
          {
            "name": "rent_apartment_p75",
            "type": "number",
            "description": "75th percentile asking rent per m² per month, apartments for rent. Null below 5 listings."
          },
          {
            "name": "rent_house_sample_size",
            "type": "integer",
            "description": "Listings behind the statistics for houses for rent."
          },
          {
            "name": "rent_house_median",
            "type": "number",
            "description": "Median asking rent per m² per month, houses for rent. Null below 5 listings."
          },
          {
            "name": "rent_house_p25",
            "type": "number",
            "description": "25th percentile asking rent per m² per month, houses for rent. Null below 5 listings."
          },
          {
            "name": "rent_house_p75",
            "type": "number",
            "description": "75th percentile asking rent per m² per month, houses for rent. Null below 5 listings."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "city_quarter_prices_latest_parquet",
      "path": "city_quarter_prices_latest.parquet",
      "title": "Luxembourg City quarter asking-price snapshot (Parquet)",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 4669,
      "hash": "sha256:907840391084ede9e2a86acb32223aecd50db7d0bf76c6b400539351bff70587"
    },
    {
      "name": "commune_registry",
      "path": "commune_registry.csv",
      "title": "Luxembourg commune registry",
      "description": "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. Grain: one row per Luxembourg commune.",
      "profile": "tabular-data-resource",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 10558,
      "hash": "sha256:9adedfe2a69e66c26b72680067b543def1cd01e846021572a090f9ba4e6090ca",
      "schema": {
        "fields": [
          {
            "name": "commune_code",
            "type": "string",
            "description": "Official 4-digit Luxembourg commune code, e.g. 0304."
          },
          {
            "name": "commune_slug",
            "type": "string",
            "description": "Stable ChatHome commune identifier."
          },
          {
            "name": "locality_id",
            "type": "string",
            "description": "Grande Région locality identifier, e.g. lu:lau:0304; the key used by the travel-times dataset."
          },
          {
            "name": "datapubliclu_zone",
            "type": "string",
            "description": "data.public.lu spatial zone identifier, e.g. lu:commune:0304."
          },
          {
            "name": "commune_name_en",
            "type": "string",
            "description": "Commune name in English."
          },
          {
            "name": "commune_name_fr",
            "type": "string",
            "description": "Commune name in French."
          },
          {
            "name": "commune_name_de",
            "type": "string",
            "description": "Commune name in German."
          },
          {
            "name": "commune_name_lu",
            "type": "string",
            "description": "Commune name in Luxembourgish."
          },
          {
            "name": "commune_name_pt",
            "type": "string",
            "description": "Commune name in Portuguese."
          },
          {
            "name": "canton",
            "type": "string",
            "description": "Luxembourg canton, as a lowercase key, e.g. esch."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "commune_registry_parquet",
      "path": "commune_registry.parquet",
      "title": "Luxembourg commune registry (Parquet)",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 9398,
      "hash": "sha256:cd0fead15c2ecf857a3eacceb4ee8e6a2a3245d0ee2f8d19c238f2de0b9e55c9"
    }
  ]
}
