API — Guest Operations
Endpointy operatora wymagają bearer tokenu. Dwa endpointy portalu gościa są publiczne, ale wymagają ważnego tokenu gospodarstwa w ścieżce.
Lista gości
GET /events/{event_id}/guests?search=kowalski
Authorization: Bearer TOKEN
Wyszukiwanie normalizuje wielkość liter i znaki diakrytyczne dla imienia, nazwiska, stołu oraz notatki dietetycznej.
Utworzenie osoby
POST /events/{event_id}/guests
Authorization: Bearer TOKEN
Content-Type: application/json
{
"first_name": "Anna",
"last_name": "Kowalska",
"email": "anna@example.com",
"rsvp": "pending",
"meal_choice": "",
"dietary_notes": "",
"accessibility_notes": "",
"table_name": "",
"is_child": false,
"is_plus_one": false,
"transport_choice": "",
"accommodation_notes": ""
}
Gospodarstwo
POST /events/{event_id}/parties
Authorization: Bearer TOKEN
Content-Type: application/json
{
"name": "Rodzina Kowalskich",
"contact_email": "anna@example.com",
"contact_phone": "+48 500 000 000",
"language": "pl",
"guest_ids": ["GUEST_UUID"]
}
Tworzenie jest transakcyjne. Każdy guest_id musi należeć do tego samego wesela.
Wydanie linku
POST /events/{event_id}/parties/{party_id}/link
Authorization: Bearer TOKEN
{
"party_id": "PARTY_UUID",
"guest_url": "https://splotweselny.pl/w/RAW_PRIVATE_TOKEN",
"expires_at": "2027-09-23T15:30:00+00:00"
}
Każde wywołanie rotuje token. Nie ma endpointu odzyskującego poprzedni surowy token.
Publiczny portal
GET /events/guest-portal/{raw_key}
Możliwe odpowiedzi: 200, 404 dla nieważnego/wyłączonego portalu i 410 dla wygasłego linku.
Publiczne RSVP
POST /events/guest-portal/{raw_key}/rsvp
Content-Type: application/json
{
"guests": [
{
"id": "GUEST_UUID",
"rsvp": "accepted",
"meal_choice": "Roślinne",
"dietary_notes": "Bez orzechów",
"accessibility_notes": "Dostęp bez schodów",
"transport_choice": "Autokar · Centrum",
"accommodation_notes": "1 noc"
}
]
}
Lista może zawierać podzbiór osób gospodarstwa, ale nie może być pusta ani zawierać obcego UUID. Po terminie RSVP endpoint zwraca 409.
Dane operacyjne i check-in
PATCH /events/{event_id}/guests/{guest_id}/operations
Authorization: Bearer TOKEN
Content-Type: application/json
{
"table_name": "Stół 4",
"transport_choice": "Dojazd własny",
"checked_in": true
}
Payload jest częściowy. checked_in: true wymaga aktualnego rsvp: accepted; inaczej API zwraca 422. Cofnięcie przybycia używa checked_in: false.
Inwarianty klienta
- nie zakładaj, że gość ma gospodarstwo;
- pokazuj check-in tylko dla
accepted; - po mutacji użyj zwróconego rekordu jako źródła prawdy;
- obsłuż
401,403,409,410i422osobno; - nie zapisuj
guest_urlw logach analitycznych; - po wysłaniu RSVP odśwież zagregowane liczniki.