Przegląd API i uwierzytelnianie
Trzy interfejsy REST StayPark Suite - kto ich używa, jak się uwierzytelnić, jak wygląda koperta odpowiedzi, stronicowanie i limity żądań.
Zaktualizowano 2 listopada 2026
Na tej stronie
StayPark Suite udostępnia trzy interfejsy REST. Ten przewodnik zbiera to, co jest w nich wspólne: adresy, uwierzytelnianie, kształt odpowiedzi, stronicowanie i limity. Szczegóły każdej operacji (pola, przykłady, odpowiedzi) są w dokumentacji referencyjnej OpenAPI, opisanej niżej.
Trzy interfejsy
| API | Adres bazowy | Kto z niego korzysta | Uwierzytelnianie |
|---|---|---|---|
| Synchronizacja | /api/sync/v1 |
serwer lokalny lokalizacji (kasa) | token synchronizacji lokalizacji + identyfikator instalacji; przy operacjach w imieniu pracownika także X-User-Uuid |
| Aplikacja pracownika | /api/employee-app/v1 |
aplikacja mobilna personelu (kolektory danych) | token Sanctum ze zdolnością employee-app (logowanie e-mailem i hasłem) |
| Aplikacja mobilna klienta | /api/mobile-app/v1 |
aplikacja klienta marki | marka w nagłówku X-Brand-Slug; token Sanctum związany z marką (część treści działa bez tokenu) |
Adres bazowy poprzedza adres instancji, np. https://<adres panelu>/api/sync/v1. Wszystkie interfejsy
przyjmują i zwracają JSON. Wyjątkiem są strumienie plików i PDF-ów.
Gdzie jest dokumentacja referencyjna
Jedynym źródłem kontraktu są pliki OpenAPI 3.0.3 w panelu, w katalogu public/api-docs:
| Plik | Adres pliku | Podgląd w panelu (po zalogowaniu) |
|---|---|---|
sync.yaml |
https://<adres panelu>/api-docs/sync.yaml |
https://<adres panelu>/help/api/sync |
employee-app.yaml |
https://<adres panelu>/api-docs/employee-app.yaml |
https://<adres panelu>/help/api/employee-app |
mobile-app.yaml |
https://<adres panelu>/api-docs/mobile-app.yaml |
https://<adres panelu>/help/api/mobile-app |
Pliki YAML są publiczne - możesz je wczytać do własnego narzędzia (Postman, Insomnia, generator klienta). Podgląd w panelu (Swagger UI) wymaga zalogowania do panelu. Przewodniki w tej sekcji niczego nie dodają do kontraktu: gdy coś się różni, rozstrzyga plik OpenAPI.
Uwierzytelnianie
- Każde żądanie niesie token lokalizacji:
Authorization: Bearer <sync_token>. Token generuje się w panelu: Lokalizacje i zasoby › Lokalizacje, karta lokalizacji, zakładka Synchronizacja. Brak tokenu daje401 MISSING_AUTH_TOKEN, nieznany token -401 INVALID_SYNC_TOKEN, a poprawny token wyłączonej lokalizacji -403 LOCALIZATION_INACTIVE. - Każde żądanie niesie też trwały identyfikator instalacji
X-Sync-Installation(8-64 znakiA-Z a-z 0-9 -). Pierwszy identyfikator zostaje powiązany z tokenem. Jeden token obsługuje jeden serwer lokalny. Inny identyfikator albo jego brak przy istniejącym powiązaniu daje403 INSTALLATION_MISMATCHi alarm dla operatora. Po wymianie sprzętu powiązanie czyści akcja „Zmień serwer lokalny” w tej samej zakładce albo nowy token. - Operacje wykonywane w imieniu pracownika (wpłaty, realizacje, kontrahenci, użytkownicy i inne oznaczone
w dokumentacji) wymagają nagłówka
X-User-Uuid. Użytkownik musi być aktywny, być aktywnym pracownikiem lokalizacji tokenu i mieć uprawnienie wymagane przez operację. Błędy:401 MISSING_USER_HEADER/INVALID_USER,403 USER_INACTIVE/USER_NOT_IN_LOCALIZATION/FORBIDDEN.
- Wyślij
POST /auth/loginzemailipassword(opcjonalniedevice_name). Konto z weryfikacją dwuetapową podaje w tym samym żądaniucode(kod z aplikacji uwierzytelniającej) alborecovery_code; bez kodu dostaje401 TWO_FACTOR_CODE_REQUIRED. - Z odpowiedzi weź
tokeni dołączaj go do każdego żądania:Authorization: Bearer <token>. - Token działa tylko w tym API (zdolność
employee-app). Wygasa po 30 dniach bez użycia - każde użycie przesuwa termin. Zmiana albo reset hasła w panelu unieważnia wszystkie tokeny konta. - Każde żądanie sprawdza, czy konto jest aktywne i ma dostęp do panelu. Uprawnienia do operacji są te same
co w panelu; ich listę zwraca
GET /me. POST /auth/logoutunieważnia bieżący token.
- Każde żądanie (poza
healthiversion) niesie markę:X-Brand-SlugalboX-Brand-UUID. Marka musi być aktywna i mieć włączony portal klienta. - Klient loguje się kodem jednorazowym (
auth/request-code→auth/verify-code, nowe konto przezauth/register) albo hasłem (auth/login, gdy marka je włączyła). - Token Sanctum jest ważny 90 dni i związany z marką, dla której go wydano. Nagłówek innej marki daje
403 BRAND_MISMATCH. - Treści marketingowe, aktualności, konfiguracja marki i jej dokumenty działają też bez tokenu (gość). Wysłany, ale zły token nie zamienia żądania w żądanie gościa.
Koperta odpowiedzi
Wszystkie trzy interfejsy zwracają ten sam kształt odpowiedzi. Powodzenie:
{ "success": true, "data": { } }Błąd - także 404 przy strumieniach PDF:
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "...",
"errors": { "email": ["..."] }
}
}Program kliencki powinien rozpoznawać błąd po error.code, a nie po treści message. Komunikaty są po polsku
i mogą się zmieniać. errors występuje przy błędach walidacji. Niektóre kody dokładają własne pola, np.
error.required_permission (aplikacja pracownika) albo error.feature i error.field (aplikacja klienta).
Pełna lista kodów: Kody błędów.
Nieoczekiwany błąd serwera (500 spoza obsługi operacji) też przychodzi w tej kopercie, z kodem SERVER_ERROR.
Szczegóły wyjątku (error.debug) są tylko w trybie debugowania. Traktuj każdą odpowiedź 5xx jako błąd
przejściowy, niezależnie od treści.
Pozostałe zasady wspólne:
- daty i znaczniki czasu w ISO 8601;
- zasoby wskazuje się przez
uuid; numeryidsą wewnętrzne dla bazy, a stare pola liczbowe (np.item_id) zostały tylko dla zgodności i są oznaczone jako przestarzałe; - kwoty: w synchronizacji pola
*_minorw groszach, w aplikacji pracownika liczby w złotych, w aplikacji klienta obiekt{ "minor": 10000, "amount": "100.00", "formatted": "100,00 zł" }.
Stronicowanie
Listy w API aplikacji pracownika i klienta mają ten sam kształt: data.items i data.pagination
z polami current_page, last_page, per_page, total, from, to.
| API | Parametry | per_page |
|---|---|---|
| Aplikacja pracownika | page, per_page |
1-100, domyślnie 25 |
| Aplikacja klienta | page, per_page |
najwyżej 50; domyślna wartość zależy od listy |
| Synchronizacja | bez stron - kursory i batch_limit (1-1000, domyślnie 500) |
nie dotyczy |
Synchronizacja nie stronicuje: pobranie zwraca paczkę zmian i kursory, a kasa pyta dalej, dopóki
has_more = true. Opis: API synchronizacji.
Limity żądań
Przekroczenie limitu daje odpowiedź 429 z nagłówkiem Retry-After (liczba sekund do kolejnej próby).
| API | Limit |
|---|---|
| Synchronizacja | całe API: 600 żądań na minutę na adres IP (ustawienie SYNC_RATE_LIMIT_PER_MINUTE); wybrane operacje mają limit własny 60, 120 albo 240 na minutę, liczony obok ogólnego, każdy własnym licznikiem dla adresu IP (lista) |
| Aplikacja pracownika | całe API: 120 żądań na minutę; logowanie: 5 prób na minutę na parę e-mail + IP; prośby o zamianę zmiany i wydruki PDF: po 30 na minutę (opis) |
| Aplikacja klienta | limit przy każdej grupie operacji, liczony osobno dla konta (np. sklep 120/min, złożenie zamówienia 10/min, zdarzenia treści 240/min); trasy logowania (30, 60 i 10 na minutę) liczą na adres IP, każda własnym licznikiem (lista) |
Limit konkretnej operacji jest w jej opisie w dokumentacji referencyjnej. Kod błędu zależy od miejsca, które
odmówiło: limit trasy daje HTTP_ERROR, a limit prób w samej operacji (np. odbiór nagrody, kod rabatowy)
daje TOO_MANY_REQUESTS albo kod operacji, np. SHOP_TOO_MANY_ATTEMPTS w sklepie czy TOO_MANY_ATTEMPTS
przy kodach weryfikacji dwuetapowej w aplikacji pracownika.
Powiązane
- API synchronizacji Jak serwer lokalny lokalizacji wymienia dane z chmurą - pobieranie (pull) z kursorami i zakresem operatora, nagrobki usunięć, wypychanie (push) z ostrzeżeniami, pliki i operacje wyłącznie online.
- Kody błędów API Zbiorcza lista kodów error.code trzech interfejsów API z kodem HTTP, znaczeniem i operacjami, które je zwracają.
- Zmiany w API Historia wersji trzech interfejsów API (pole info.version w plikach OpenAPI) - co doszło w każdej wersji i na co zwrócić uwagę przy aktualizacji klienta.