Przejdź do głównej zawartości

Szybki start

Ten przewodnik prowadzi przez cały przepływ na Twojej organizacji w Rezeri: klucz, usługi, wolne terminy, rezerwacja, jej odczyt i anulowanie. Potrzebujesz tylko curl.

  1. Potrzebujesz organizacji w Rezeri z planem, który obejmuje dostęp do API — zobacz cennik. Panel jest pod adresem app.rezeri.com.
  2. W panelu dodaj co najmniej jedną aktywną usługę, przypisz do niej pracownika i ustaw mu godziny pracy. API pokazuje tylko usługi, które klient może zarezerwować, a bez godzin pracy GET /v1/availability nie zwróci żadnego slotu.
  3. Otwórz Ustawienia → API i webhooki (sekcja widoczna tylko dla właściciela organizacji) i utwórz klucz ze scopes: services:read, availability:read, bookings:read, bookings:write.
  4. Skopiuj klucz. Zobaczysz go tylko raz. Ma postać rez_live_<key_id>_<sekret>.

Zapisz klucz w zmiennej środowiskowej:

Okno terminala
export REZERI_API_KEY="rez_live_..."
Okno terminala
curl https://api.rezeri.com/v1/services \
-H "Authorization: Bearer $REZERI_API_KEY"

Odpowiedź to strona listy:

{
"data": [
{
"id": "21db474e-f72b-41af-a63f-9e8394402158",
"name": "Strzyżenie męskie",
"duration_minutes": 30,
"price": "90.00",
"currency": "PLN",
"modes": ["offline"],
"payment": "none",
"staff_ids": ["244a0e58-ee93-4117-9365-a3aac2e779b4"],
"required_client_fields": ["name", "email"]
}
],
"has_more": false,
"next_cursor": null
}

Zanotuj id usługi. Dwa pola decydują o tym, co wyślesz w kroku 4:

  • required_client_fields — dane klienta, których organizacja wymaga (name zawsze, do tego email, phone albo oba).
  • payment — none albo optional pozwala zarezerwować bez płatności online. required i deposit oznaczają płatność z góry — zobacz Płatności online.

Podaj usługę i zakres dat (from i to włącznie, YYYY-MM-DD, najwyżej 31 dni). Poniższy przykład pyta o najbliższe 7 dni (działa w macOS i Linuksie):

Okno terminala
SERVICE_ID="21db474e-f72b-41af-a63f-9e8394402158" # id usługi z kroku 2
FROM=$(date -u +%F)
TO=$(date -u -v+7d +%F 2>/dev/null || date -u -d '+7 days' +%F)
curl "https://api.rezeri.com/v1/availability?service_id=$SERVICE_ID&from=$FROM&to=$TO" \
-H "Authorization: Bearer $REZERI_API_KEY"
{
"data": [
{
"start": "2026-10-21T08:00:00+02:00",
"end": "2026-10-21T08:30:00+02:00",
"staff_id": "244a0e58-ee93-4117-9365-a3aac2e779b4"
}
]
}

Każdy slot ma pracownika, który go obsłuży. Wybierz jeden slot i zapisz jego wartości:

Okno terminala
START="2026-10-21T08:00:00+02:00" # start wybranego slotu
STAFF_ID="244a0e58-ee93-4117-9365-a3aac2e779b4" # staff_id wybranego slotu

Wyślij start i staff_id wybranego slotu oraz dane klienta. Jako klienta podaj siebie — własne imię i własny adres e-mail. To prawdziwa rezerwacja: potwierdzenie e-mailem (i SMS-em, jeśli organizacja je wysyła) trafi na podany adres, a pracownik dostanie powiadomienie o nowej rezerwacji. Jeśli required_client_fields zawiera phone, dodaj też swój numer w polu phone.

Okno terminala
MY_NAME="Anna Kowalska" # Twoje imię i nazwisko
MY_EMAIL="[email protected]" # Twój adres e-mail

Nagłówek Idempotency-Key jest wymagany — to Twój unikalny identyfikator tej próby. Jeśli połączenie zerwie się w trakcie, ponów żądanie z tym samym kluczem, a nie powstanie druga rezerwacja. Zobacz Idempotencja.

Okno terminala
curl -X POST https://api.rezeri.com/v1/bookings \
-H "Authorization: Bearer $REZERI_API_KEY" \
-H "Idempotency-Key: 6c0f4a52-order-1001" \
-H "Content-Type: application/json" \
-d '{
"service_id": "'"$SERVICE_ID"'",
"staff_id": "'"$STAFF_ID"'",
"start": "'"$START"'",
"client": {"name": "'"$MY_NAME"'", "email": "'"$MY_EMAIL"'"},
"metadata": {"order_id": "1001"}
}'

Odpowiedź 201 Created zawiera pełną rezerwację:

{
"id": "311905c9-7a15-45c0-8b66-1dd2e8711875",
"public_code": "RT7ER2KMRW",
"status": "accepted",
"service_id": "21db474e-f72b-41af-a63f-9e8394402158",
"staff_id": "244a0e58-ee93-4117-9365-a3aac2e779b4",
"start": "2026-10-21T08:00:00+02:00",
"end": "2026-10-21T08:30:00+02:00",
"client": {"name": "Anna Kowalska", "email": "[email protected]", "phone": null},
"price": "90.00",
"currency": "PLN",
"payment": {"required": false, "status": "not_required", "amount": null, "url": null},
"no_show_at": null,
"manage_url": "https://app.rezeri.com/b/RT7ER2KMRW",
"metadata": {"order_id": "1001"},
"created_at": "2026-10-19T11:17:50.711828+02:00"
}

Zapisz id. Pole metadata wraca w każdej odpowiedzi z tą rezerwacją — możesz tam trzymać identyfikator z własnego systemu.

status zależy od ustawień usługi: accepted (przyjęta), pending (czeka na akceptację pracownika) albo awaiting_payment (czeka na płatność online).

Gdy ktoś zajmie termin przed Tobą, dostaniesz 409 slot_unavailable. Pobierz wtedy wolne terminy ponownie.

Okno terminala
BOOKING_ID="311905c9-7a15-45c0-8b66-1dd2e8711875" # id z odpowiedzi kroku 4
curl "https://api.rezeri.com/v1/bookings/$BOOKING_ID" \
-H "Authorization: Bearer $REZERI_API_KEY"

Odpowiedź ma ten sam kształt co w kroku 4. Rezerwacja jest też widoczna w kalendarzu w panelu.

Na koniec zwolnij termin. Body jest opcjonalne — możesz podać powód (reason, do 500 znaków). Idempotency-Key jest tu opcjonalny.

Okno terminala
curl -X POST "https://api.rezeri.com/v1/bookings/$BOOKING_ID/cancel" \
-H "Authorization: Bearer $REZERI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"reason": "Rezerwacja testowa integracji"}'

Odpowiedź 200 OK zawiera rezerwację ze statusem cancelled. Anulowanie też wysyła wiadomości: e-mail (i SMS, jeśli organizacja je wysyła) o odwołaniu wizyty na Twój adres oraz powiadomienie dla pracownika. Więcej o testowaniu: Testowanie integracji.

Jeśli usługa ma payment: "required" albo "deposit", w kroku 4 dodaj return_url — adres https na domenie dozwolonej dla klucza. Rezerwacja powstanie ze statusem awaiting_payment i adresem płatności w payment.url. Cały przepływ opisuje Płatności online, a płatność bez prawdziwych pieniędzy sprawdzisz w trybie testowym bramki — zobacz Testowanie integracji.