letznest Developer API

A clean, normalized, machine-readable feed of Luxembourg rental listings — the data no portal exposes. Filter, geo-search, and benchmark prices over live data.

Get a free API key →

Who it's for

Relocation services

Surface live, filterable Luxembourg rentals inside your own client portal — no scraping, no per-portal parsing.

HR & mobility teams

Show relocating employees accurate stock and commute-relevant options, benchmarked against real €/m².

Proptech & research

Build on a normalized, deduplicated feed with market price data per commune and clean provenance.

One clean source instead of monitoring atHome, immotop and vivi by hand. Normalized fields, deduplicated across sources, English-friendly, and every record links back to its origin.

Authentication

All endpoints except /stats require an API key, passed as a Bearer token. Create one at /api-keys. The plaintext key is shown only once.

curl -H "Authorization: Bearer lzn_live_xxx" \
  https://letznest.lu/api/v1/listings

Rate limits & tiers

TierPriceRequests / dayFlagged data
Free€0100No
Starter€29/mo5,000No
Pro€99/moUnlimitedYes
EnterpriseCustomUnlimitedYes

Exceeding your daily quota returns 429 with a Retry-After header.

GET /api/v1/listings

Paginated, filterable listings. Returns { data: [...], meta: {...} }.

ParameterTypeDescription
communestringFilter by commune (case-insensitive)
min_price / max_priceintMonthly rent range (EUR)
min_roomsintMinimum number of rooms
listing_typeenumRENT | SALE | SUBLET | FLATSHARE
sourcestringFeed name, or 'letznest' for native posts
studentboolOnly student-friendly listings
lat / lng / radius_kmnumberGeo search (all three required)
pageintPage number (default 1)
per_pageintResults per page (default 20, max 100)
sortenumprice | -price | size | -size | createdAt | -createdAt
# Two-bed+ rentals in Kirchberg under €2500, newest first
curl -H "Authorization: Bearer lzn_live_xxx" \
  "https://letznest.lu/api/v1/listings?commune=Kirchberg&min_rooms=2&max_price=2500&sort=-createdAt"
# Geo search: listings within 3km of Luxembourg City centre
curl -H "Authorization: Bearer lzn_live_xxx" \
  "https://letznest.lu/api/v1/listings?lat=49.6117&lng=6.1319&radius_km=3"

GET /api/v1/listings/:id

A single active listing by its letznest id. Returns 404 if missing or not publicly visible.

curl -H "Authorization: Bearer lzn_live_xxx" \
  https://letznest.lu/api/v1/listings/clx123abc

GET /api/v1/market/prices

Average rent and €/m² by commune, computed live from active rentals. Optional commune filter.

curl -H "Authorization: Bearer lzn_live_xxx" \
  "https://letznest.lu/api/v1/market/prices?commune=Limpertsberg"

GET /api/v1/stats

Public aggregate counts — no authentication required. Total active listings, breakdown by source and commune, and data freshness.

curl https://letznest.lu/api/v1/stats

Example: JavaScript

const res = await fetch(
  "https://letznest.lu/api/v1/listings?commune=Esch-sur-Alzette&max_price=1800",
  { headers: { Authorization: "Bearer " + process.env.LETZNEST_API_KEY } }
);
const { data, meta } = await res.json();
console.log(meta.total, "listings; showing", data.length);

Response shape

{
  "data": [
    {
      "id": "clx123abc",
      "url": "https://letznest.lu/en/listings/clx123abc",
      "source": "atHome",
      "external_id": "12345",
      "title": "Bright 2-bedroom apartment",
      "price_eur": 1800,
      "area_m2": 75,
      "rooms": 3,
      "commune": "Limpertsberg",
      "lat": 49.62, "lng": 6.12,
      "listing_type": "RENT",
      "accepts_students": false,
      "images": ["https://..."],
      "created_at": "2026-06-01T00:00:00.000Z"
    }
  ],
  "meta": { "total": 1240, "page": 1, "per_page": 20, "last_updated": "2026-06-05T12:30:00.000Z" }
}

Webhooks for new-listing notifications are not part of this release. Listings data is sourced from licensed agency feeds (OpenIMMO) and native posts; each record links back to its source.