API publique
Disponibilité, prix et données des appartements en JSON — gratuit, sans API-Key.
Tous les endpoints sont en lecture seule, utilisables sans inscription et renvoient du JSON avec CORS ouvert. Le point d'entrée pour les assistants IA et les intégrations est /api/v1/apartments : une requête indique quels appartements sont libres sur une période — y compris prix, surface, adresse et lien vers la page de détail. Aperçu lisible par machine du site : /llms.txt.
Endpoints
| Endpoint | Description |
|---|---|
GET /api/v1/apartments?from&to | Recherche combinée par période : appartements libres entre from et to (YYYY-MM-DD), y compris prix, surface, pièces, adresse et lien vers la page de détail. Le point d'entrée recommandé. |
GET /api/v1/apartments | Sans paramètres : les mêmes données d'appartements avec les prochaines fenêtres libres par appartement. |
GET /api/availability-search?from&to | Uniquement les slugs et noms des appartements libres sur la période (réponse allégée). |
GET /api/availability-windows | Fenêtres libres par appartement (sans prix ni métadonnées). |
GET /api/availability/<icalSlug>?days=240 | Grille journalière libre/occupé pour un appartement (icalSlug issu de la réponse de /api/v1/apartments). |
GET /api/prices | Prix par nuit, mensuels et longue durée ainsi que frais de ménage (CHF). |
GET /api/apartment-facts | Surfaces des appartements en m². |
Réponse : recherche par période
GET /api/v1/apartments?from=2026-08-01&to=2026-08-15 — exemple abrégé :
{
"provider": "apartments.zuerich",
"from": "2026-08-01",
"to": "2026-08-15",
"nights": 14,
"mode": "short_term",
"count": 5,
"apartments": [
{
"slug": "badenerstrasse-4101",
"icalSlug": "4101",
"name": "Business Apartment 4101",
"description": "Business-Studio im 1. Stock an der Badenerstrasse 414 …",
"type": "studio",
"typeName": "Studio",
"quartier": "kreis-4",
"quartierName": "Kreis 4, Badenerstrasse",
"address": { "street": "Badenerstrasse 414", "zip": "8004", "city": "Zürich" },
"coordinates": { "lat": 47.3775, "lng": 8.4892 },
"sizeM2": 38,
"rooms": 1,
"maxGuests": 2,
"floor": 1,
"features": ["Voll ausgestattete Küche", "Smart TV", "Highspeed WLAN"],
"prices": {
"currency": "CHF",
"night": 95,
"month": 2190,
"longTerm": 2090,
"cleaningFee": 50
},
"url": {
"de": "https://www.apartments.zuerich/de/wohnungen/badenerstrasse-4101/",
"en": "https://www.apartments.zuerich/en/apartments/badenerstrasse-4101/"
},
"image": "https://www.apartments.zuerich/_astro/wohnzimmer.CVxq6Kk3.jpg"
}
],
"unavailable": [
{ "slug": "algier-15-studio", "name": "Studio AL15-1", "url": { "de": "…", "en": "…" } }
],
"incomplete": [],
"combinations": [
{
"switches": 1,
"switchDate": "2026-08-08",
"segments": [
{ "slug": "badenerstrasse-4404", "icalSlug": "4404", "name": "Business Apartment 4404",
"from": "2026-08-01", "to": "2026-08-08", "nights": 7, "url": { "de": "…", "en": "…" } },
{ "slug": "badenerstrasse-4101", "icalSlug": "4101", "name": "Business Apartment 4101",
"from": "2026-08-08", "to": "2026-08-15", "nights": 7, "url": { "de": "…", "en": "…" } }
]
}
],
"warnings": []
} | Champ | Type | Description |
|---|---|---|
from / to / nights / mode | string / number | Période demandée ; mode est short_term en dessous de 28 nuits, sinon mid_or_long_term. |
count | number | Nombre d'appartements libres sur la période. |
apartments[] | array | Appartements libres avec toutes les métadonnées, prix et liens. |
apartments[].slug | string | ID public de l'appartement, identique au slug de la page de détail. |
apartments[].icalSlug | string | Clé de jointure vers les endpoints de bas niveau (/api/prices, /api/availability/…). |
apartments[].prices | object | null | Prix en CHF ; null si la source des prix est temporairement indisponible (voir warnings). |
apartments[].url | object | Liens absolus vers la page de détail (allemand et anglais). |
unavailable[] | array | Appartements indisponibles sur la période (uniquement slug, nom, lien). |
incomplete[] | array | Appartements dont les sources de disponibilité étaient incomplètes — aucune indication possible. |
combinations[] | array | Combinaisons réservables avec exactement un changement d'appartement (max. 3) lorsque la période n'est pas libre d'un seul tenant – chaque segment est soumis à la fenêtre de réservation de 60 jours, format JSON uniquement. |
warnings[] | array | Avertissements sur des sources secondaires indisponibles, p. ex. prices_unavailable. |
Réponse : fenêtres libres (sans paramètres)
Sans from/to, chaque appartement contient en plus un objet availability avec les prochaines fenêtres libres (end est exclusif ; null = ouvert jusqu'à l'horizon des données) :
"availability": {
"offered": { "shortTerm": true, "midTerm": true, "longTerm": false },
"windows": [{ "start": "2026-08-03", "end": "2026-09-01", "days": 29 }],
"shortTermFreeDays": 12,
"midTermAvailableFrom": "2026-08-03",
"longTermFreeFrom": null
} Export CSV (?format=csv)
Avec ?format=csv, /api/v1/apartments renvoie un tableau CSV plat au lieu de JSON — une ligne par appartement, pensé pour les tableurs. Les deux modes (recherche par période et fenêtres) prennent en charge le paramètre. Colonnes de base dans un ordre stable :
slug, name, description, type, type_name, quartier, quartier_name,
street, zip, city, lat, lng, size_m2, rooms, max_guests, floor, features,
price_night, price_month, price_long_term, cleaning_fee, listing_status,
url_de, url_en - Mode période (avec from/to) : en plus la colonne status (available, unavailable ou incomplete) — tous les appartements apparaissent dans un seul tableau.
- Mode fenêtres (sans paramètres) : en plus incomplete ainsi que next_window_from et next_window_to (uniquement la prochaine fenêtre libre ; fin ouverte = to vide), short_term_free_days, mid_term_available_from et long_term_free_from.
- Les structures imbriquées sont aplaties : features reliées par ;, prix en colonnes distinctes en CHF ; warnings sont omis dans le CSV.
Google Sheets (IMPORTDATA)
Insérez la formule dans une cellule quelconque — Google Sheets charge le tableau directement et le met à jour périodiquement de lui-même :
=IMPORTDATA("https://www.apartments.zuerich/api/v1/apartments?from=2026-08-01&to=2026-08-15&format=csv") Interpréter correctement les prix
- Court séjour (mode short_term, en dessous de 28 nuits) : valeur indicative = night × nights + cleaningFee.
- Logement temporaire (dès 28 nuits) : prix mensuel month, dès 3 mois le prix réduit longue durée longTerm.
- Tous les prix sont en CHF et sans engagement — c'est l'offre via la demande de réservation sur la page de détail qui fait foi.
Actualité et mise en cache
- La disponibilité provient en direct du système de réservation ; les réponses sont mises en cache jusqu'à 60 secondes (navigateur) et 300 secondes (edge CDN).
- Les réponses d'erreur ne sont jamais mises en cache.
Exemples
curl
curl -s 'https://www.apartments.zuerich/api/v1/apartments?from=2026-08-01&to=2026-08-15' | jq '.apartments[].name' JavaScript
const res = await fetch(
"https://www.apartments.zuerich/api/v1/apartments?from=2026-08-01&to=2026-08-15"
);
const data = await res.json();
for (const apartment of data.apartments) {
console.log(apartment.name, apartment.prices?.night, "CHF/Nacht", apartment.url.de);
} CORS
Tous les endpoints envoient Access-Control-Allow-Origin: * — l'API est interrogeable directement depuis le navigateur, depuis des scripts et par des agents IA.
Versionnage
Les endpoints sous /api/v1/ sont stables : des champs peuvent être ajoutés, les champs existants ne changent ni ne disparaissent sans nouvelle version.
Utilisation
L'API est librement utilisable pour les assistants IA, les services de relocation et les intégrations privées. En cas de publication des données, nous apprécions une mention de la source avec un lien vers apartments.zuerich.
Des questions ou des besoins plus importants ? info@datenpfleger.ch · llms.txt