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/listingsRate limits & tiers
| Tier | Price | Requests / day | Flagged data |
|---|---|---|---|
| Free | €0 | 100 | No |
| Starter | €29/mo | 5,000 | No |
| Pro | €99/mo | Unlimited | Yes |
| Enterprise | Custom | Unlimited | Yes |
Exceeding your daily quota returns 429 with a Retry-After header.
GET /api/v1/listings
Paginated, filterable listings. Returns { data: [...], meta: {...} }.
| Parameter | Type | Description |
|---|---|---|
| commune | string | Filter by commune (case-insensitive) |
| min_price / max_price | int | Monthly rent range (EUR) |
| min_rooms | int | Minimum number of rooms |
| listing_type | enum | RENT | SALE | SUBLET | FLATSHARE |
| source | string | Feed name, or 'letznest' for native posts |
| student | bool | Only student-friendly listings |
| lat / lng / radius_km | number | Geo search (all three required) |
| page | int | Page number (default 1) |
| per_page | int | Results per page (default 20, max 100) |
| sort | enum | price | -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/clx123abcGET /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/statsExample: 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.