# Buchungskalender: API-Vertrag Verbindlich für Strang 2 (Widget und Buchungsseite, bauen gegen die öffentliche Schnittstelle) und Strang 3 (Portal, baut gegen die Kunden-API). Task 6 bis 8 erfüllen ihn. Fehlerform überall `{ fehler: code, felder?: {feld: text} }`. ## Öffentlich (`/api/public/unterkunft/v1`) - `GET /:siteKey` → `{ aktiv:true, anbieter:{ name, ort, datenschutzUrl }, akzentfarbe, formToken, unterkuenfte:[{ id, name, maxPersonen, mindestNaechte, checkIn, checkOut }] }` oder `{ aktiv:false }`. - `GET /:siteKey/belegung?unterkunft=&von=YYYY-MM-DD&bis=YYYY-MM-DD` → `{ belegt:[{von,bis}], heute:'YYYY-MM-DD', bisMax:'YYYY-MM-DD' }` (Quellen nicht offengelegt). - `POST /:siteKey/anfrage` Body `{ unterkunft, von, bis, personen, name, firma, email, telefon, nachricht, formToken, kontakt_url }` → `201 { nummer }`. - `GET /:siteKey/buchung/:id?t=` → `{ status, nummer, unterkunft:{name,checkIn,checkOut}, von, bis, naechte, personen, posten, summen, steuerart, fristAt, stornobedingungen, anbieter:{firma,inhaber,strasse,plz,ort,email,telefon}, gast:{name,firma}, rechnungsadresse?, zahlarten:['vorort'|'online'], zahlart?, bezahlt:boolean, rechnungNummer? }`. - `POST /:siteKey/buchung/:id?t=` Body `{ rechnungsadresse:{name,firma,strasse,plz,ort,land}, zahlart }` → `{ status:'gebucht', rechnungNummer, zahlungUrl? }` (bei `online` direkt Checkout-URL). - `POST /:siteKey/buchung/:id/zahlung?t=` → `{ url }`. - `GET /:siteKey/buchung/:id/rechnung.pdf?t=&art=rechnung|storno` → PDF. ## Kunde (`/api/unterkunft`, Session, `?projectId=`) - `GET /status` - `GET|PUT /einstellungen` - `GET /unterkuenfte` - `POST /unterkuenfte` - `PUT|DELETE /unterkuenfte/:id` - `GET|PUT /unterkuenfte/:id/preise` - `GET /unterkuenfte/:id/kalender?von&bis` → `{ bereiche:[{von,bis,quelle,anfrageNummer?,sperreId?,notiz?}] }` - `POST /unterkuenfte/:id/sperren` - `DELETE /sperren/:id` - `POST /unterkuenfte/:id/ical-importe` - `DELETE /unterkuenfte/:id/ical-importe/:importId` - `POST /unterkuenfte/:id/ical-export/erneuern` - `GET /anfragen?filter=offen|gebucht|alle` - `GET /anfragen/:id` (inkl. `vorschlag` = `berechnePreis`) - `POST /anfragen/:id/freigeben` `{posten,fristTage,nachricht}` - `POST /anfragen/:id/ablehnen` `{text}` - `POST /anfragen/:id/bezahlt` - `POST /anfragen/:id/stornieren` `{grund, erstattungCent}` - `POST /preisvorschau` `{unterkunftId,von,bis,personen}` - `GET /rechnungen` - `GET /rechnungen/:id.pdf` (nur Einzel-PDF, kein ZIP — Spec N7) - `POST /stripe/verbinden`, `POST /stripe/vorhandenes-konto`, `POST /stripe/aktualisieren` - `POST /anfrage-funktion` `{art,einheiten,portale,nachricht}` - `POST /anfrage-funktion/zurueckziehen` ## Team (`/api/team/unterkunft`) - `GET /:customerId` - `POST /:customerId/anfrage` `{projectId, entscheidung, begruendung}`