Dla integratorów

Dokumentacja integracji

Jak połączyć kasę, agregator dostaw albo własny system z Rostmenu. Trzy punkty styku: przyjmowanie zamówień, wysyłka zamówień do Twojego systemu i pobieranie aktualnego menu.

Ostatnia aktualizacja: lipiec 2026

1. Zanim zaczniesz

Rostmenu udostępnia trzy punkty integracji: przyjmowanie zamówień z systemów zewnętrznych, wysyłkę zamówień do kasy lub innego systemu lokalu oraz pobieranie aktualnego menu. To wystarcza, żeby podłączyć kasę fiskalną, agregator dostaw, drukarkę kuchenną albo własny system restauracji.
  • adres bazowy: https://rostmenu.com;
  • wszystkie dane w formacie JSON, kodowanie UTF-8;
  • komunikacja wyłącznie po HTTPS;
  • integracja działa na poziomie jednego lokalu - każdy lokal ma własny token.

2. Token i autoryzacja

Token generuje właściciel lokalu w panelu: Integracje → Token dla systemów zewnętrznych. Ten sam token autoryzuje przyjmowanie zamówień i pobieranie menu.
X-Inbound-Token: <token lokalu>

Alternatywnie token można przekazać w parametrze zapytania ?token= - wygodne przy testach i w narzędziach typu Zapier czy Make, które nie pozwalają ustawić nagłówka. W środowisku produkcyjnym zalecamy nagłówek: parametry zapytania trafiają do logów serwerów pośredniczących.

Token jest tajny i daje dostęp do zamówień oraz menu lokalu. Jeśli wyciekł, właściciel generuje nowy w panelu - stary przestaje działać natychmiast.

3. Przyjmowanie zamówień (POST)

Zamówienie z systemu zewnętrznego trafia na wspólną listę zamówień lokalu z oznaczeniem źródła. Menu nie jest dopasowywane - skład przychodzi gotowy i zapisujemy go jako zdjęcie stanu.
POST /api/integrations/inbound
X-Inbound-Token: <token>
X-Idempotence-Key: <unikalny klucz próby>
Content-Type: application/json
PoleTypOpis
items *arrayPozycje zamówienia. Maksymalnie 100.
items[].name *stringNazwa pozycji widoczna dla obsługi. Do 120 znaków.
items[].qtynumberIlość, 1-999. Domyślnie 1.
items[].unitPricenumberCena za sztukę w walucie lokalu.
items[].optionNamesstring[]Dodatki i modyfikatory, do 10 pozycji.
items[].notestringUwaga do pozycji, np. bez cebuli.
totalnumberKwota zamówienia. Gdy brak - liczymy z pozycji.
orderTypestringdinein, takeaway lub delivery. Domyślnie takeaway.
sourcestringNazwa źródła, np. wolt, glovo, kasa. Widoczna przy zamówieniu.
customerNamestringImię gościa.
customerPhonestringTelefon gościa.
addressstringAdres dostawy (dla orderType = delivery).
deliveryFeenumberKoszt dostawy.
commentstringUwaga do całego zamówienia.
paidbooleantrue, jeśli zamówienie zostało już opłacone po stronie platformy.

Przykład

curl -X POST https://rostmenu.com/api/integrations/inbound \
  -H "X-Inbound-Token: TWOJ_TOKEN" \
  -H "X-Idempotence-Key: wolt-8842-1" \
  -H "Content-Type: application/json" \
  -d '{
    "source": "wolt",
    "orderType": "delivery",
    "customerName": "Anna",
    "customerPhone": "+48600100200",
    "address": "ul. Kwiatowa 5/2, Warszawa",
    "deliveryFee": 9.90,
    "paid": true,
    "items": [
      { "name": "Pizza Margherita", "qty": 2, "unitPrice": 38.00 },
      { "name": "Tiramisu", "qty": 1, "unitPrice": 22.00, "note": "bez kakao" }
    ]
  }'

Odpowiedź

{ "ok": true, "orderId": 1841 }

4. Powtórzenia i klucz idempotencji

Agregatory i kasy powtarzają żądanie, gdy nie doczekają się odpowiedzi w zadanym czasie. Bez zabezpieczenia każdy taki retry tworzy drugie zamówienie na kuchni.

Dlatego przy każdej próbie wyślij nagłówek X-Idempotence-Key z wartością unikalną dla zamówienia (np. własny numer zamówienia z Twojego systemu). Powtórzenie z tym samym kluczem w ciągu 10 minut nie utworzy nowego zamówienia - odpowiemy tym samym orderId i dodamy pole duplicate: true.

{ "ok": true, "orderId": 1841, "duplicate": true }

Klucz może zawierać litery, cyfry, myślnik i podkreślenie, do 64 znaków. Bez tego nagłówka każde żądanie traktujemy jako nowe zamówienie.

5. Wysyłka zamówień do Twojego systemu (webhook)

Właściciel podaje w panelu adres w polu Integracje → Adres webhooka. Pod ten adres wysyłamy metodą POST każde aktualne zamówienie - z sali, z dostawy i opłacone kartą.
  • format treści: to samo zamówienie, które widzi panel (numer, stolik, pozycje, kwoty, status);
  • wysyłka jest jednokierunkowa i nie blokuje obsługi gościa;
  • limit czasu odpowiedzi: 5 sekund. Odpowiadaj od razu, przetwarzaj po swojej stronie;
  • adres musi być publiczny i po HTTPS. Adresy lokalne i sieci prywatnych są odrzucane;
  • nie ponawiamy wysyłki - zamówienie pozostaje dostępne w panelu i przez API.

Jeśli Twoja kasa jest na liście obsługiwanych w panelu (m.in. Poster, Dotykačka, Syrve, GoPOS, POSbistro, Gastro POS), wystarczy wybrać ją z listy i podać identyfikator lokalu - własny webhook nie jest wtedy potrzebny.

7. Kody odpowiedzi i błędy

Błędy zwracamy w jednym formacie:
{ "error": "unauthorized", "message": "Nieprawidłowy lub brakujący token integracji" }
KoderrorZnaczenie
200-Odczyt zakończony powodzeniem
201-Zamówienie utworzone
400emptyBrak pozycji w zamówieniu
401unauthorizedZły lub brakujący token
429too_manyPrzekroczony limit zapytań

Limity: 300 zamówień / 5 minut oraz 120 pobrań menu / 5 minut na adres IP. Po przekroczeniu odczekaj i ponów - najlepiej z tym samym kluczem idempotencji.

8. Lista kontrolna wdrożenia

  1. Właściciel lokalu generuje token w panelu i przekazuje go Tobie bezpiecznym kanałem.
  2. Wyślij jedno zamówienie testowe i sprawdź, czy pojawia się w panelu z właściwym źródłem.
  3. Powtórz to samo żądanie z tym samym kluczem idempotencji - powinieneś dostać ten sam numer zamówienia.
  4. Jeśli odbierasz zamówienia u siebie, podaj adres webhooka i sprawdź, czy odpowiadasz poniżej 5 sekund.
  5. Jeśli korzystasz z menu, pobierz je i sprawdź obsługę pola available oraz modyfikatorów.
  6. Ustal, co robisz przy 429 i przy braku odpowiedzi - ponowienie z tym samym kluczem jest bezpieczne.

9. Pytania i zgłoszenia

Pytania techniczne, prośby o nowe pola albo zgłoszenia błędów: [email protected]. W zgłoszeniu podaj nazwę lokalu, przybliżoną godzinę zdarzenia i treść żądania - to zwykle wystarcza, żeby odtworzyć sytuację.

Rozwijamy integracje na podstawie realnych zgłoszeń. Jeśli potrzebujesz czegoś, czego tu nie ma - napisz, co dokładnie chcesz osiągnąć.