API pubblica

Disponibilità, prezzi e dati degli appartamenti in JSON — gratis, senza API-Key.

Tutti gli endpoint sono di sola lettura, utilizzabili senza registrazione e restituiscono JSON con CORS aperto. Il punto di ingresso per assistenti AI e integrazioni è /api/v1/apartments: una richiesta risponde a quali appartamenti sono liberi in un periodo — inclusi prezzi, superficie, indirizzo e link alla pagina di dettaglio. Panoramica leggibile dalle macchine del sito: /llms.txt.

Endpoint

Endpoint Descrizione
GET /api/v1/apartments?from&to Ricerca combinata per periodo: appartamenti liberi tra from e to (YYYY-MM-DD), inclusi prezzi, superficie, locali, indirizzo e link alla pagina di dettaglio. Il punto di ingresso consigliato.
GET /api/v1/apartments Senza parametri: gli stessi dati degli appartamenti con le prossime finestre libere per ciascun appartamento.
GET /api/availability-search?from&to Solo slug e nomi degli appartamenti liberi nel periodo (risposta snella).
GET /api/availability-windows Finestre libere per ciascun appartamento (senza prezzi e metadati).
GET /api/availability/<icalSlug>?days=240 Griglia giornaliera libero/occupato per un appartamento (icalSlug dalla risposta di /api/v1/apartments).
GET /api/prices Prezzi per notte, mensili e a lungo termine nonché spese di pulizia (CHF).
GET /api/apartment-facts Superfici degli appartamenti in m².

Risposta: ricerca per periodo

GET /api/v1/apartments?from=2026-08-01&to=2026-08-15 — esempio abbreviato:

{
  "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": []
}
Campo Tipo Descrizione
from / to / nights / mode string / number Periodo richiesto; mode è short_term sotto le 28 notti, altrimenti mid_or_long_term.
count number Numero di appartamenti liberi nel periodo.
apartments[] array Appartamenti liberi con tutti i metadati, prezzi e link.
apartments[].slug string ID pubblico dell'appartamento, identico allo slug della pagina di dettaglio.
apartments[].icalSlug string Chiave di join agli endpoint di basso livello (/api/prices, /api/availability/…).
apartments[].prices object | null Prezzi in CHF; null se la fonte dei prezzi è temporaneamente irraggiungibile (vedi warnings).
apartments[].url object Link assoluti alla pagina di dettaglio (tedesco e inglese).
unavailable[] array Appartamenti non disponibili nel periodo (solo slug, nome, link).
incomplete[] array Appartamenti le cui fonti di disponibilità erano incomplete — nessuna indicazione possibile.
combinations[] array Combinazioni prenotabili con esattamente un cambio di appartamento (max. 3) quando il periodo non è libero in un unico blocco – ogni segmento è soggetto alla finestra di prenotazione di 60 giorni, solo in formato JSON.
warnings[] array Segnalazioni su fonti secondarie non disponibili, ad es. prices_unavailable.

Risposta: finestre libere (senza parametri)

Senza from/to, ogni appartamento contiene inoltre un oggetto availability con le prossime finestre libere (end è esclusivo; null = aperto fino all'orizzonte dei dati):

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

Esportazione CSV (?format=csv)

Con ?format=csv, /api/v1/apartments restituisce una tabella CSV piatta invece di JSON — una riga per appartamento, pensata per i fogli di calcolo. Entrambe le modalità (ricerca per periodo e finestre) supportano il parametro. Colonne base in ordine stabile:

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
  • Modalità periodo (con from/to): in più la colonna status (available, unavailable o incomplete) — tutti gli appartamenti compaiono in un'unica tabella.
  • Modalità finestre (senza parametri): in più incomplete nonché next_window_from e next_window_to (solo la prossima finestra libera; fine aperta = to vuoto), short_term_free_days, mid_term_available_from e long_term_free_from.
  • Le strutture annidate vengono appiattite: features unite con ;, prezzi come colonne singole in CHF; warnings non compaiono nel CSV.

Google Sheets (IMPORTDATA)

Inserisci la formula in una cella qualsiasi — Google Sheets carica la tabella direttamente e la aggiorna periodicamente da sé:

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

Interpretare correttamente i prezzi

  • Soggiorno breve (mode short_term, sotto le 28 notti): valore indicativo = night × nights + cleaningFee.
  • Alloggio temporaneo (da 28 notti): prezzo mensile month, da 3 mesi il prezzo ridotto a lungo termine longTerm.
  • Tutti i prezzi sono in CHF e senza impegno — fa fede l'offerta tramite la richiesta di prenotazione sulla pagina di dettaglio.

Attualità e caching

  • La disponibilità arriva in tempo reale dal sistema di prenotazione; le risposte sono memorizzate nella cache fino a 60 secondi (browser) e 300 secondi (edge CDN).
  • Le risposte di errore non vengono mai memorizzate nella cache.

Esempi

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

Tutti gli endpoint inviano Access-Control-Allow-Origin: * — l'API è interrogabile direttamente dal browser, dagli script e dagli agenti AI.

Versionamento

Gli endpoint sotto /api/v1/ sono stabili: possono essere aggiunti campi, i campi esistenti non cambiano né scompaiono senza una nuova versione.

Utilizzo

L'API è liberamente utilizzabile per assistenti AI, servizi di relocation e integrazioni private. In caso di pubblicazione dei dati apprezziamo un'indicazione della fonte con link a apartments.zuerich.

Domande o requisiti maggiori? info@datenpfleger.ch · llms.txt