Portal do Desenvolvedor
Aceda a inteligencia imobiliaria luxemburguesa atraves da nossa API publica
Primeiros passos
Step 1 — Get your API key
Create a free account at chathome.lu/developers to get your API key. Keys are shown once at creation — store them securely.
# Your API key looks like this:\nch_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6Step 2 — Authenticate
Pass your API key in every request using the X-API-Key header.
curl -X GET 'https://chathome.lu/api/public/v1/communes' \
-H 'X-API-Key: ch_your_api_key_here' \
-H 'Accept: application/json'Step 3 — Make your first request
Try the communes endpoint to get all Luxembourg communes with their liveability scores.
Parameters
Request
curl -X GET \
'/api/public/v1/communes?locale=en' \
-H 'Accept: application/json'Endpoints
/communes
Returns a list of all 102 Luxembourg communes with their slugs, localized names, and liveability scores.
Parameters
| Name | Type | Description |
|---|---|---|
locale | string | Locale for commune namese.g. en |
Response
{
"communes": [
{
"slug": "luxembourg",
"name": "Luxembourg City",
"liveabilityScore": 87
}
],
"total": 102,
"locale": "en"
}Error Codes
INTERNAL_ERROR
Failed to fetch communes from the server.
Parameters
Request
curl -X GET \
'/api/public/v1/communes?locale=en' \
-H 'Accept: application/json'/communes/{slug}/intelligence
Returns the full commune intelligence document for a given commune slug, including liveability scores and dimension data.
Parameters
| Name | Type | Description |
|---|---|---|
slug* | string | Commune URL sluge.g. luxembourg |
Response
{
"communeSlug": "luxembourg",
"communeName": {
"en": "Luxembourg City",
"fr": "Luxembourg",
"de": "Luxemburg",
"lb": "Lëtzebuerg"
},
"liveabilityScore": 87,
"dimensions": {
"price": {
"score": 6.2,
"trend": "down",
"trendPercent": -2.1,
"sparkline": [
7100,
7200,
7050,
6980
],
"dataAvailability": "full"
},
"safety": {
"score": 9.1,
"trend": "flat",
"trendPercent": 0.1,
"sparkline": [
9,
9.1,
9.1,
9.1
],
"dataAvailability": "full"
}
},
"summary": {
"en": "Luxembourg City offers excellent connectivity and high safety scores..."
},
"lastUpdated": "2026-03-01T00:00:00Z"
}Error Codes
NOT_FOUND
No intelligence data for this commune.
UNAUTHORIZED
Invalid or missing API key.
Parameters
Request
curl -X GET \
'/api/public/v1/communes/{slug}/intelligence?slug=luxembourg' \
-H 'Accept: application/json'/communes/{slug}/trends
Returns historical price trend data for a commune, including quarterly prices and momentum indicators.
Parameters
| Name | Type | Description |
|---|---|---|
slug* | string | Commune URL sluge.g. luxembourg |
period | string | Trend period: qoq (quarter-over-quarter) or yoy (year-over-year)e.g. yoy |
quarters | number | Number of quarters to return (max 20)e.g. 8 |
Response
{
"communeSlug": "luxembourg",
"period": "yoy",
"buyPricePerSqm": 11520,
"rentPricePerSqm": 32.5,
"changePercent": 3.2,
"changeType": "yoy",
"dataAvailability": "full",
"calculationBasis": "Based on 847 comparable transactions"
}Error Codes
NOT_FOUND
No trend data for this commune.
Parameters
Request
curl -X GET \
'/api/public/v1/communes/{slug}/trends?slug=luxembourg&period=yoy&quarters=8' \
-H 'Accept: application/json'/communes/{slug}/forecast
Returns AI-generated price forecasts for a commune with confidence intervals for the next 4 quarters.
Parameters
| Name | Type | Description |
|---|---|---|
slug* | string | Commune URL sluge.g. luxembourg |
propertyType | string | apartment or housee.g. apartment |
Response
{
"communeSlug": "luxembourg",
"propertyType": "apartment",
"generatedAt": "2026-03-01T00:00:00Z",
"generatedForQuarter": "Q1-2026",
"modelVersion": "v2.3.1",
"predictions": [
{
"quarter": "Q2-2026",
"predictedValue": 11850,
"confidenceLow": 11200,
"confidenceHigh": 12500,
"changePercent": 2.9
},
{
"quarter": "Q3-2026",
"predictedValue": 12100,
"confidenceLow": 11300,
"confidenceHigh": 12900,
"changePercent": 4.8
}
],
"commentary": {
"en": "The Luxembourg market shows continued moderate growth..."
},
"isClamped": false
}Error Codes
NOT_FOUND
No forecast data for this commune (minimum 8 quarters required).
BAD_REQUEST
propertyType must be 'apartment' or 'house'.
Parameters
Request
curl -X GET \
'/api/public/v1/communes/{slug}/forecast?slug=luxembourg&propertyType=apartment' \
-H 'Accept: application/json'/market-index
Returns the Luxembourg-wide market index tracking overall price momentum across all communes.
Parameters
| Name | Type | Description |
|---|---|---|
period | string | qoq or yoye.g. yoy |
quarters | number | Number of quarters (max 20)e.g. 8 |
Response
{
"value": 124.7,
"changePercent": 4.1,
"quarter": "Q1-2026",
"computedAt": "2026-03-01T00:00:00Z"
}Error Codes
INTERNAL_ERROR
Failed to compute market index.
Parameters
Request
curl -X GET \
'/api/public/v1/market-index?period=yoy&quarters=8' \
-H 'Accept: application/json'MCP Agent Tools
Connect AI agents (Claude Desktop, ChatGPT, Cursor, and others) directly to chathome via the Model Context Protocol. Each tool requires one or more scopes — request them when creating your API key.
Available Scopes
listings:readRead access to property listings. Required for search_rentals, search_for_sale, and get_listing.
market:readRead access to market intelligence. Required for get_market_context, get_price_estimate, and get_commute_times.
inquiries:writeWrite access to create inquiry conversations on behalf of the authenticated user. Required for submit_inquiry.
inquiries:readRead access to inquiry conversations created by this API key. Required for get_inquiry_status.
Agent-to-agent flow
- Search listings with
search_rentalsorsearch_for_sale - Enrich with
get_listing,get_market_context, andget_commute_times - Validate price with
get_price_estimate - Contact the owner via
submit_inquiry - Poll for replies with
get_inquiry_status
listings:readSearch rental properties by commune, price range, bedrooms, and more.
Example input
{
"commune": "luxembourg",
"maxPrice": 2500,
"beds": 2
}listings:readSearch properties for sale across Luxembourg communes.
Example input
{
"commune": "esch-sur-alzette",
"propertyType": "apartment"
}listings:readRetrieve full details for a specific listing by its ID.
Example input
{
"id": "abc123",
"locale": "en"
}market:readGet real estate market data and liveability scores for a Luxembourg commune.
Example input
{
"commune": "kirchberg",
"locale": "en"
}market:readAI-powered price estimate for a property using the chathome valuation model.
Example input
{
"propertyType": "apartment",
"listingType": "sale",
"commune": "luxembourg",
"areaSqm": 85,
"bedrooms": 2,
"constructionYear": 2010,
"energyClass": "B"
}market:readCommute time estimates from a commune to Luxembourg City, Kirchberg, or Belval.
Example input
{
"commune": "differdange",
"destination": "belval",
"mode": "transit"
}inquiries:writeSend an inquiry about a listing. Creates a conversation thread for chathome-hosted listings, or returns external agency contact details.
Example input
{
"listingId": "abc123",
"message": "My client is interested in this apartment. Is it still available?",
"agentName": "Acme Property AI",
"contactEmail": "ai@acme.example"
}inquiries:readPoll an MCP agent inquiry conversation for replies. Only accessible for conversations created via the MCP agent channel.
Example input
{
"conversationId": "conv_xyz789"
}Claude Agent Skill
A packaged skill teaches Claude when and how to use these tools — search workflows, budget-fit annotation, and Luxembourg market context. Upload the zip in claude.ai under Settings → Capabilities, or install the Claude Code plugin (bundles the MCP server too).
Limites de taxa
Rate limits are applied per API key using a 24-hour sliding window. Limits vary by tier:
Free
100/day
Free forever
Basic
1,000/day
€49/month
Premium
10,000/day
€199/month
Note: When a rate limit is exceeded, the API returns a 429 Too Many Requests response with a Retry-After header indicating when you can retry.
Codigos de erro
UNAUTHORIZED
Chave API invalida
RATE_LIMIT_EXCEEDED
Limite de taxa excedido
NOT_FOUND
Recurso nao encontrado
BAD_REQUEST
Parametros de pedido invalidos
INTERNAL_ERROR
Ocorreu um erro inesperado no servidor
Exemplos de codigo
bash
# Install jq for JSON formatting
# List all communes
curl -X GET \
'https://chathome.lu/api/public/v1/communes?locale=en' \
-H 'X-API-Key: ch_your_api_key_here' \
-H 'Accept: application/json' | jq .javascript
// Fetch commune intelligence
const response = await fetch(
'https://chathome.lu/api/public/v1/communes/luxembourg/intelligence',
{
headers: {
'X-API-Key': 'ch_your_api_key_here',
'Accept': 'application/json',
},
}
);
const data = await response.json();
console.log('Liveability:', data.liveabilityScore);python
import requests
headers = {
'X-API-Key': 'ch_your_api_key_here',
'Accept': 'application/json',
}
# Get commune forecast
response = requests.get(
'https://chathome.lu/api/public/v1/communes/luxembourg/forecast',
headers=headers,
params={'propertyType': 'apartment'}
)
data = response.json()
for pred in data['predictions']:
print(f"{pred['quarter']}: €{pred['predictedValue']}/m²")On this page