{
 "openapi": "3.0.3",
 "info": {
  "title": "Dove Living Direktbuchung",
  "version": "1.0.0",
  "description": "Dove Living: 3 Ferien-/Monteurapartments (bis 8 bzw. 6 Gäste) in Schwandorf (Bayern), Bahnhofstraße 9. Ablauf: 1) verfuegbarkeit_suchen(von, bis, gaeste) zeigt freie Apartments mit Endpreis; bei flexiblen Daten belegungskalender(listing, von). 2) optional angebot_berechnen. 3) buchung_anfragen nur auf ausdrücklichen Wunsch des Gastes mit Vorname, Nachname, E-Mail – liefert einen Link zur Zahlungsseite auf buchen.dove-living.de (30 Min. gültig); die Buchung ist erst nach der Kartenzahlung fest. 4) buchung_status zeigt die Reservierungsnummer. Preise/Verfügbarkeit kommen live aus Hostaway – nichts selbst berechnen. Datum JJJJ-MM-TT. English: vacation apartments in Schwandorf, Germany; search, quote, request a booking (guest pays on the operator's own payment page), check status. Answer in the user's language. Dieselbe Funktion gibt es als MCP-Server unter /mcp.",
  "contact": {
   "email": "info@dove-living.de"
  },
  "termsOfService": "https://buchen.dove-living.de/buchungsbedingungen"
 },
 "servers": [
  {
   "url": "https://buchen.dove-living.de"
  }
 ],
 "paths": {
  "/api/verfuegbarkeit": {
   "get": {
    "operationId": "verfuegbarkeit_suchen",
    "summary": "Freie Apartments mit Endpreis",
    "description": "Sucht freie Dove-Living-Apartments in Schwandorf für einen Zeitraum und eine Gästezahl. Liefert je Apartment: frei ja/nein mit Grund, Mindestaufenthalt, max. Gäste und – wenn frei – den Endpreis inkl. Reinigung und MwSt. aus Hostaway.",
    "parameters": [
     {
      "name": "von",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string",
       "format": "date"
      },
      "description": "Anreise"
     },
     {
      "name": "bis",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string",
       "format": "date"
      },
      "description": "Abreise"
     },
     {
      "name": "gaeste",
      "in": "query",
      "required": true,
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 20
      },
      "description": ""
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "400": {
      "description": "Fehler",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Fehler"
        }
       }
      }
     },
     "404": {
      "description": "Fehler",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Fehler"
        }
       }
      }
     },
     "409": {
      "description": "Fehler",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Fehler"
        }
       }
      }
     },
     "429": {
      "description": "Fehler",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Fehler"
        }
       }
      }
     },
     "502": {
      "description": "Fehler",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Fehler"
        }
       }
      }
     }
    }
   }
  },
  "/api/angebot": {
   "get": {
    "operationId": "angebot_berechnen",
    "summary": "Verbindlicher Preis für ein Apartment",
    "description": "Verbindlicher Preis für ein bestimmtes Apartment und Zeitraum (Hostaway priceDetails, mit Einzelposten) plus Verfügbarkeit, Check-in/-out-Zeiten und Adresse.",
    "parameters": [
     {
      "name": "listing",
      "in": "query",
      "required": true,
      "schema": {
       "type": "integer",
       "enum": [
        542791,
        546331,
        548767
       ],
       "description": "Apartment-ID: 542791 (bis 8 Gäste), 546331 (bis 6), 548767 (bis 6)"
      },
      "description": ""
     },
     {
      "name": "von",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string",
       "format": "date"
      },
      "description": ""
     },
     {
      "name": "bis",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string",
       "format": "date"
      },
      "description": ""
     },
     {
      "name": "gaeste",
      "in": "query",
      "required": true,
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 20
      },
      "description": ""
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "400": {
      "description": "Fehler",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Fehler"
        }
       }
      }
     },
     "404": {
      "description": "Fehler",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Fehler"
        }
       }
      }
     },
     "409": {
      "description": "Fehler",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Fehler"
        }
       }
      }
     },
     "429": {
      "description": "Fehler",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Fehler"
        }
       }
      }
     },
     "502": {
      "description": "Fehler",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Fehler"
        }
       }
      }
     }
    }
   }
  },
  "/api/buchung": {
   "post": {
    "operationId": "buchung_anfragen",
    "summary": "Zeitraum halten + Stripe-Zahlungslink",
    "description": "Reserviert den Zeitraum 30 Minuten und erzeugt einen Stripe-Checkout-Link für den Gast. Die Buchung wird erst nach erfolgreicher Kartenzahlung verbindlich; ohne Zahlung wird der Zeitraum automatisch freigegeben. Nur nach ausdrücklichem Wunsch des Gastes aufrufen.",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
         "listing",
         "von",
         "bis",
         "gaeste",
         "vorname",
         "nachname",
         "email"
        ],
        "properties": {
         "listing": {
          "type": "integer",
          "enum": [
           542791,
           546331,
           548767
          ],
          "description": "Apartment-ID: 542791 (bis 8 Gäste), 546331 (bis 6), 548767 (bis 6)"
         },
         "von": {
          "type": "string",
          "format": "date",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
          "description": "Anreisedatum JJJJ-MM-TT"
         },
         "bis": {
          "type": "string",
          "format": "date",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
          "description": "Abreisedatum JJJJ-MM-TT"
         },
         "gaeste": {
          "type": "integer",
          "minimum": 1,
          "maximum": 20
         },
         "vorname": {
          "type": "string",
          "maxLength": 60
         },
         "nachname": {
          "type": "string",
          "maxLength": 60
         },
         "email": {
          "type": "string",
          "format": "email",
          "maxLength": 200
         },
         "telefon": {
          "type": "string",
          "maxLength": 40
         },
         "test_token": {
          "type": "string",
          "description": "Nur im Testbetrieb nötig (vom Betreiber erhalten)."
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "403": {
      "description": "Fehler",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Fehler"
        }
       }
      }
     },
     "400": {
      "description": "Fehler",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Fehler"
        }
       }
      }
     },
     "404": {
      "description": "Fehler",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Fehler"
        }
       }
      }
     },
     "409": {
      "description": "Fehler",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Fehler"
        }
       }
      }
     },
     "429": {
      "description": "Fehler",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Fehler"
        }
       }
      }
     },
     "502": {
      "description": "Fehler",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Fehler"
        }
       }
      }
     }
    }
   }
  },
  "/api/kalender": {
   "get": {
    "operationId": "belegungskalender",
    "summary": "Tagesgenaue Belegung eines Apartments",
    "description": "Tagesgenaue Belegung eines Dove-Living-Apartments für bis zu 62 Tage ab 'von' (frei/belegt, Mindestaufenthalt, Anreise möglich) – ohne Preise. Für flexible Reisedaten oder um freie Lücken zu finden; den Preis danach mit angebot_berechnen holen.",
    "parameters": [
     {
      "name": "listing",
      "in": "query",
      "required": true,
      "schema": {
       "type": "integer",
       "enum": [
        542791,
        546331,
        548767
       ],
       "description": "Apartment-ID: 542791 (bis 8 Gäste), 546331 (bis 6), 548767 (bis 6)"
      },
      "description": ""
     },
     {
      "name": "von",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string",
       "format": "date"
      },
      "description": ""
     },
     {
      "name": "bis",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "format": "date"
      },
      "description": ""
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "400": {
      "description": "Fehler",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Fehler"
        }
       }
      }
     },
     "404": {
      "description": "Fehler",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Fehler"
        }
       }
      }
     },
     "409": {
      "description": "Fehler",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Fehler"
        }
       }
      }
     },
     "429": {
      "description": "Fehler",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Fehler"
        }
       }
      }
     },
     "502": {
      "description": "Fehler",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Fehler"
        }
       }
      }
     }
    }
   }
  },
  "/api/buchung/{buchungs_id}": {
   "get": {
    "operationId": "buchung_status",
    "summary": "Status einer Buchungsanfrage",
    "parameters": [
     {
      "name": "buchungs_id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "404": {
      "description": "Fehler",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Fehler"
        }
       }
      }
     }
    }
   }
  }
 },
 "components": {
  "schemas": {
   "Fehler": {
    "type": "object",
    "properties": {
     "fehler": {
      "type": "string"
     },
     "code": {
      "type": "string"
     }
    }
   }
  }
 }
}