← gwada.app

Dokumentation

Anmelden

Reservierung

Restaurant-Konfiguration lesen sowie Reservierungen buchen und verwalten.

Modul-ID im API-Schlüssel: reservation. Das Restaurant wird aus dem Schlüssel abgeleitet — kein Slug im Body nötig (wird serverseitig gesetzt).

Lesen

Endpunkt: GET /api/v1/reservation

curl -s "https://gwada.app/api/v1/reservation" \
  -H "Authorization: Bearer gwada_sk_live_…" \
  -H "Accept: application/json"

Antwort: öffentliche Buchungs-Konfiguration — gleiche Struktur wie das Embed-Widget. Cache: public, s-maxage=60, stale-while-revalidate=300.

{
  "data": {
    "id": "uuid",
    "name": "Restaurant Name",
    "slug": "mein-slug",
    "accentHex": "#c45c26",
    "timezone": "Europe/Berlin",
    "defaultDwellMinutes": 120,
    "bookingLeadTimeHours": 0,
    "minMinutesBeforeClosing": 60,
    "embedFormFooterText": null,
    "weeklyHours": { "monday": { "closed": false, "open": "11:30", "close": "22:00" } },
    "dateExceptions": []
  }
}

Nutze defaultDwellMinutes, um ends_at zu berechnen, wenn der Gast nur Startzeit wählt. bookingLeadTimeHours und Öffnungszeiten/Ausnahmen bestimmen die Buchbarkeit.

Buchen

Endpunkt: POST /api/v1/reservation

curl -s -X POST "https://gwada.app/api/v1/reservation" \
  -H "Authorization: Bearer gwada_sk_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "guest_first_name": "Anna",
    "guest_last_name": "Muster",
    "guest_phone": "+491701234567",
    "guest_email": null,
    "party_size": 2,
    "starts_at": "2026-08-01T18:00:00.000Z",
    "ends_at": "2026-08-01T20:00:00.000Z",
    "notify_email": false,
    "notify_whatsapp": true,
    "terms_accepted": true
  }'

Erfolg (200):

{
  "data": {
    "reservation_number": 42,
    "guest_pin": "1234"
  }
}

Pflicht: Nachname, mind. ein Kontaktkanal (Telefon oder E-Mail), mind. ein Benachrichtigungskanal, terms_accepted: true. Zeiten müssen innerhalb der öffentlichen Buchbarkeit liegen.

Verwalten (laden / ändern)

Endpunkt: POST /api/v1/reservation/manage

Mit action: "load" die Reservierung laden (Gast-Ansicht ohne interne IDs). Ohne Action bzw. mit Update-Feldern: Änderung einreichen (ggf. als Änderungswunsch).

curl -s -X POST "https://gwada.app/api/v1/reservation/manage" \
  -H "Authorization: Bearer gwada_sk_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "action": "load",
    "reservation_number": 42,
    "pin": "1234"
  }'

Laden liefert u. a. Gastname, Party-Size, Zeiten und Status unter data.reservation.

curl -s -X POST "https://gwada.app/api/v1/reservation/manage" \
  -H "Authorization: Bearer gwada_sk_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "reservation_number": 42,
    "pin": "1234",
    "guest_first_name": "Anna",
    "guest_last_name": "Muster",
    "guest_phone": "+491701234567",
    "guest_email": null,
    "party_size": 3,
    "starts_at": "2026-08-01T19:00:00.000Z",
    "ends_at": "2026-08-01T21:00:00.000Z",
    "notify_email": false,
    "notify_whatsapp": true,
    "terms_accepted": true
  }'

Typische Schreib-Fehler

  • 400 terms_required / last_name_required / contact_required / notify_channel_required
  • 400 booking_lead_time / outside_opening_hours
  • 401 invalid_credentials — falsche Nummer/PIN beim Manage
  • 403 not_editable — storniert / abgelehnt / no-show

Bei erfolgreicher Änderung: { "data": { "ok": true, "change_request": false } }. change_request: true, wenn der Status nicht mehr pending ist und ein Änderungswunsch angelegt wurde.

Hinweise

  • Schreib-Antworten sind Cache-Control: private, no-cache, …
  • CORS erlaubt GET, POST, OPTIONS
  • Gleiche Validierung wie das öffentliche Buchungsformular (Vorlauf, Öffnungszeiten, …)
  • Auth & Limits: Authentifizierung, Rate Limits