Öffentliche API

Verfügbarkeit, Preise und Wohnungsdaten als JSON — kostenlos, ohne API-Key.

Alle Endpoints sind read-only, ohne Anmeldung nutzbar und liefern JSON mit offenem CORS. Der Einstiegspunkt für AI-Assistenten und Integrationen ist /api/v1/apartments: eine Anfrage beantwortet, welche Wohnungen in einem Zeitraum frei sind — inklusive Preisen, Grösse, Adresse und Link zur Detailseite. Maschinenlesbarer Überblick über die Website: /llms.txt.

Endpoints

Endpoint Beschreibung
GET /api/v1/apartments?from&to Kombinierte Zeitraum-Suche: freie Wohnungen zwischen from und to (YYYY-MM-DD), inkl. Preisen, Grösse, Zimmer, Adresse und Detailseiten-Link. Der empfohlene Einstiegspunkt.
GET /api/v1/apartments Ohne Parameter: dieselben Wohnungsdaten mit den nächsten freien Zeitfenstern je Wohnung.
GET /api/availability-search?from&to Nur freie Wohnungs-Slugs und Namen im Zeitraum (schlanke Antwort).
GET /api/availability-windows Freie Zeitfenster je Wohnung (ohne Preise und Metadaten).
GET /api/availability/<icalSlug>?days=240 Tagesraster frei/belegt für eine Wohnung (icalSlug aus der Antwort von /api/v1/apartments).
GET /api/prices Nacht-, Monats- und Langzeitpreise sowie Reinigungsgebühr (CHF).
GET /api/apartment-facts Wohnungsgrössen in m².

Antwort: Zeitraum-Suche

GET /api/v1/apartments?from=2026-08-01&to=2026-08-15 — gekürztes Beispiel:

{
  "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": []
}
Feld Typ Beschreibung
from / to / nights / mode string / number Angefragter Zeitraum; mode ist short_term unter 28 Nächten, sonst mid_or_long_term.
count number Anzahl freier Wohnungen im Zeitraum.
apartments[] array Freie Wohnungen mit allen Metadaten, Preisen und Links.
apartments[].slug string Öffentliche Wohnungs-ID, identisch mit dem Slug der Detailseite.
apartments[].icalSlug string Join-Key zu den Low-Level-Endpoints (/api/prices, /api/availability/…).
apartments[].prices object | null Preise in CHF; null, wenn die Preisquelle vorübergehend nicht erreichbar ist (siehe warnings).
apartments[].url object Absolute Links zur Detailseite (Deutsch und Englisch).
unavailable[] array Im Zeitraum nicht verfügbare Wohnungen (nur Slug, Name, Link).
incomplete[] array Wohnungen, deren Verfügbarkeitsquellen unvollständig waren — keine Aussage möglich.
combinations[] array Buchbare Kombinationen mit genau einem Wohnungswechsel (max. 3), wenn der Zeitraum nicht am Stück frei ist – jedes Segment unterliegt dem 60-Tage-Buchungsfenster, nur im JSON-Format.
warnings[] array Hinweise auf ausgefallene Nebenquellen, z. B. prices_unavailable.

Antwort: freie Zeitfenster (ohne Parameter)

Ohne from/to enthält jede Wohnung zusätzlich ein availability-Objekt mit den nächsten freien Fenstern (end ist exklusiv; null = offen bis zum Datenhorizont):

"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
}

CSV-Export (?format=csv)

Mit ?format=csv liefert /api/v1/apartments statt JSON eine flache CSV-Tabelle — eine Zeile pro Wohnung, gedacht für Tabellenkalkulationen. Beide Modi (Zeitraum-Suche und Zeitfenster) unterstützen den Parameter. Basisspalten in stabiler Reihenfolge:

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
  • Zeitraum-Modus (mit from/to): zusätzlich die Spalte status (available, unavailable oder incomplete) — alle Wohnungen erscheinen in einer Tabelle.
  • Fenster-Modus (ohne Parameter): zusätzlich incomplete sowie next_window_from und next_window_to (nur das nächste freie Fenster; offenes Ende = leeres to), short_term_free_days, mid_term_available_from und long_term_free_from.
  • Verschachteltes wird geglättet: features mit ; verbunden, Preise als Einzelspalten in CHF; warnings entfallen im CSV.

Google Sheets (IMPORTDATA)

Die Formel in eine beliebige Zelle einfügen — Google Sheets lädt die Tabelle direkt und aktualisiert sie periodisch von selbst:

=IMPORTDATA("https://www.apartments.zuerich/api/v1/apartments?from=2026-08-01&to=2026-08-15&format=csv")

Preise richtig interpretieren

  • Kurzaufenthalt (mode short_term, unter 28 Nächten): Richtwert = night × nights + cleaningFee.
  • Wohnen auf Zeit (ab 28 Nächten): Monatspreis month, ab 3 Monaten der reduzierte Langzeitpreis longTerm.
  • Alle Preise in CHF und unverbindlich — massgebend ist die Offerte über die Buchungsanfrage auf der Detailseite.

Aktualität & Caching

  • Verfügbarkeit kommt live aus dem Buchungssystem; Antworten sind bis zu 60 Sekunden (Browser) bzw. 300 Sekunden (Edge-CDN) gecacht.
  • Fehlerantworten werden nie gecacht.

Beispiele

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

Alle Endpoints senden Access-Control-Allow-Origin: * — die API ist direkt aus dem Browser, aus Scripts und von AI-Agenten abfragbar.

Versionierung

Endpoints unter /api/v1/ sind stabil: Felder können hinzukommen, bestehende Felder ändern oder verschwinden nicht ohne neue Version.

Nutzung

Die API ist für AI-Assistenten, Relocation-Services und private Integrationen frei nutzbar. Bei Veröffentlichung der Daten freuen wir uns über eine Quellenangabe mit Link auf apartments.zuerich.

Fragen oder höhere Anforderungen? info@datenpfleger.ch · llms.txt