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_required400 booking_lead_time/outside_opening_hours401 invalid_credentials— falsche Nummer/PIN beim Manage403 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