{"openapi":"3.1.0","info":{"title":"Apartament Zdrojowa 45 — wycena pobytu","version":"1.0.0","description":"Publiczny odczyt bez tworzenia rezerwacji. To własne API przygotowujące integrację, nie implementacja ACP ani UCP. Dostępność uwzględnia ostatni import iCal, który może być opóźniony. Każda rezerwacja wymaga ponownej walidacji oraz świadomej akceptacji warunków na stronie."},"servers":[{"url":"https://zdrojowa45.pl"}],"paths":{"/api/stays/quote":{"get":{"operationId":"quoteStay","summary":"Sprawdź cenę i dostępność konkretnego pobytu","description":"Bez uwierzytelnienia. Odpowiedzi nie wolno cache'ować. Nie wysyłaj danych osobowych. continueUrl otwiera formularz z datami i liczbą gości; nie utrwala ceny ani zwolnień z opłaty. Odczyt nie blokuje terminu. bookable oznacza możliwość rezerwacji automatycznej w chwili sprawdzenia; obowiązują validUntil i requiresRevalidation.","parameters":[{"name":"start","in":"query","required":true,"description":"Przyjazd, nie w przeszłości; daty według Europe/Warsaw.","schema":{"type":"string","format":"date"}},{"name":"end","in":"query","required":true,"description":"Wyjazd; 3–60 nocy, dodatkowo minimum danej taryfy.","schema":{"type":"string","format":"date"}},{"name":"guests","in":"query","required":true,"schema":{"type":"integer","minimum":1,"maximum":6}},{"name":"taxableGuests","in":"query","required":false,"description":"Liczba osób objętych opłatą uzdrowiskową, najwyżej guests. Domyślnie wszyscy goście; zwolnienia wymagają weryfikacji gospodarza.","schema":{"type":"integer","minimum":0,"maximum":6}}],"responses":{"200":{"description":"Wycena, również dla terminu zajętego lub niezweryfikowanego. Sam HTTP 200 nie oznacza wolnego terminu.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StayQuote"}}}},"400":{"description":"Nieprawidłowe lub powtórzone parametry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Obsługiwane jest wyłącznie GET."},"503":{"description":"Chwilowa niedostępność usługi. Nie zakładaj wolnych terminów."}}}}},"components":{"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}},"StayQuote":{"type":"object","required":["version","propertyId","stay","checkedAt","validUntil","inventoryHeld","requiresRevalidation","availability","pricing","costs","bookable","automatic","payment","terms","continueUrl"],"properties":{"version":{"const":"1"},"propertyId":{"const":"apartament-zdrojowa45"},"stay":{"type":"object","required":["start","end","guests","nights"],"properties":{"start":{"type":"string","format":"date"},"end":{"type":"string","format":"date"},"guests":{"type":"integer","minimum":1,"maximum":6},"nights":{"type":"integer","minimum":3,"maximum":60}}},"checkedAt":{"type":"string","format":"date-time"},"validUntil":{"type":"string","format":"date-time","description":"Najwyżej 5 minut, ograniczone świeżością iCal i północą w Polsce. Może równać się checkedAt przy nieaktualnym kalendarzu. To termin ponownego odczytu, nie gwarancja ceny lub dostępności."},"inventoryHeld":{"const":false},"requiresRevalidation":{"const":true},"availability":{"type":"object","required":["status","fresh","lastSynchronizedAt"],"properties":{"status":{"enum":["available","unavailable","unknown"],"description":"available: brak znanej kolizji i świeży kalendarz. unavailable: znana blokada. unknown: nie można zweryfikować. iCal nie daje atomowej synchronizacji między kanałami."},"fresh":{"type":"boolean"},"lastSynchronizedAt":{"type":["string","null"],"format":"date-time"}}},"pricing":{"type":"object","required":["status","revision"],"properties":{"status":{"enum":["published","unpublished"]},"revision":{"type":"integer"},"total":{"type":["integer","null"],"minimum":0,"description":"Kwota w groszach; null oznacza brak pełnej wyceny, nigdy zero."},"accommodation":{"type":["integer","null"],"minimum":0,"description":"Kwota w groszach; null oznacza brak pełnej wyceny, nigdy zero."},"cleaning":{"const":0},"guests":{"type":"integer"},"nights":{"type":"integer"},"minNights":{"type":"integer"},"meetsMinimum":{"type":"boolean"},"notes":{"type":"string"},"breakdown":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","format":"date"},"amount":{"type":["integer","null"],"minimum":0,"description":"Kwota w groszach; null oznacza brak pełnej wyceny, nigdy zero."},"source":{"type":"string"}}}}},"description":"Przy unpublished kwoty i szczegóły taryfy są pominięte. published nie oznacza dostępności terminu."},"costs":{"type":"object","required":["currency","unit","accommodation","cleaningIncluded","onSiteTax","total"],"properties":{"currency":{"const":"PLN"},"unit":{"const":"minor"},"accommodation":{"type":["integer","null"],"minimum":0,"description":"Kwota w groszach; null oznacza brak pełnej wyceny, nigdy zero."},"cleaningIncluded":{"const":true},"total":{"type":["integer","null"],"minimum":0,"description":"Kwota w groszach; null oznacza brak pełnej wyceny, nigdy zero."},"onSiteTax":{"type":"object","required":["amount","taxableGuests","rates"],"properties":{"amount":{"type":["integer","null"],"minimum":0,"description":"Kwota w groszach; null oznacza brak pełnej wyceny, nigdy zero."},"taxableGuests":{"type":"integer","minimum":0,"maximum":6},"rates":{"type":"array","items":{"type":"object","required":["year","rate","nights"],"properties":{"year":{"type":"integer"},"rate":{"type":["integer","null"],"minimum":0,"description":"Kwota w groszach; null oznacza brak pełnej wyceny, nigdy zero."},"nights":{"type":"integer"}}}}}}}},"bookable":{"type":"boolean","description":"Rezerwacja automatyczna jest obecnie możliwa. false może oznaczać także brak cen, danych opłaty, konfiguracji lub zbyt bliski przyjazd."},"automatic":{"type":"object","required":["enabled","available","revision"],"properties":{"enabled":{"type":"boolean"},"available":{"type":"boolean"},"revision":{"type":"integer"},"reason":{"type":"string"},"deadline":{"type":"string","format":"date-time"},"taxRates":{"type":"array","items":{"type":"object","properties":{"year":{"type":"integer"},"rate":{"type":["integer","null"],"minimum":0,"description":"Kwota w groszach; null oznacza brak pełnej wyceny, nigdy zero."},"nights":{"type":"integer"}}}}}},"payment":{"type":"object","required":["method","dueAt","paid"],"properties":{"method":{"const":"bank_transfer"},"dueAt":{"type":["string","null"],"format":"date-time"},"paid":{"const":false}}},"terms":{"type":"object","required":["version","url","privacyUrl","cancellationDeadline","checkIn","checkOut","timeZone"],"properties":{"version":{"type":"string"},"url":{"type":"string","format":"uri"},"privacyUrl":{"type":"string","format":"uri"},"cancellationDeadline":{"type":"string","description":"Informacyjna data bezpłatnego anulowania po polsku; pełne zasady pod url."},"checkIn":{"const":"15:00"},"checkOut":{"const":"10:00"},"timeZone":{"const":"Europe/Warsaw"}}},"continueUrl":{"type":"string","format":"uri","description":"Publiczny link zawierający wyłącznie daty i liczbę gości. Otwórz w przeglądarce i sprawdź cenę ponownie."}}}}}}