{"openapi":"3.1.0","info":{"title":"cenaly.ge LLM API","version":"1.0.0","description":"მანქანური REST API ხელოვნური ინტელექტის ასისტენტებისა და აგენტებისთვის:\ncenaly.ge-ის ობიექტის მენიუსა და დაწესებულების ინფორმაციის წაკითხვა, კატალოგში ძებნა,\nკალათების აწყობა, შეკვეთების გაფორმება და მაგიდის დაჯავშნის მოთხოვნა.\n\n**მისამართები** — ობიექტი იდენტიფიცირდება დომენის კოდით დიდი ასოებით, იმავეთი,\nრაც QR-ზე / მენიუს URL-შია (cenaly.ge/MYCAFE → `MYCAFE`).\n\n**აუთენტიფიკაცია** — არ არის საჭირო: ეს სტუმრის დონეა. გამოუცნობი id-ები მუშაობს\nbearer-ტოკენებად — `cartId` / `orderId` / `reservationId` წვდომას აძლევს მხოლოდ\nთავის რესურსზე, ზუსტად როგორც ვებ-შეკვეთებში.\n\n**შეცდომები** — არა-2xx პასუხებს აქვს ფორმა `{\"error\": \"message\"}`, ვალიდაციის\nშეცდომები ამატებს `\"details\": [...]`.\n\n**ენები** — წამკითხავი ენდპოინტები იღებს `lang`-ს (ISO 639-1), ნაგულისხმევად ინგლისური.\n\n**MCP** — იგივე შესაძლებლობები (პლუს OAuth 2.1 ავტორიზებული დონე საკუთარი ანგარიშის\nმონაცემებზე წვდომით) ხელმისაწვდომია Model Context Protocol-ით: `POST https://api.cenaly.ge/llm/mcp`\n(stateless streamable HTTP). მანქანური discovery-დოკუმენტი: `GET https://api.cenaly.ge/llm/v1`."},"servers":[{"url":"https://api.cenaly.ge/llm/v1"}],"tags":[{"name":"Menu","description":"ობიექტის გამოქვეყნებული მენიუ/კატალოგი: სრული მენიუ ფასებით, ვარიანტების ჯგუფებითა და დამატებებით, პოზიციების მიღება სათითაოდ და ჯგუფურად, პროდუქტების სემანტიკური ძებნა.","x-displayName":"მენიუ"},{"name":"Store","description":"ინფორმაცია თავად დაწესებულებაზე: სამუშაო საათები (+openNow), კონტაქტები, მიტანის/თვითგატანისა და გადახდის ვარიანტები, იურიდიული დოკუმენტები და ძებნა პოლიტიკებში/FAQ-ში/საინფორმაციო გვერდებზე.","x-displayName":"დაწესებულება"},{"name":"Hotel","description":"მხოლოდ სასტუმროებისთვის და მხოლოდ წაკითხვა: ფაქტები სასტუმროს სტუმრების ცოდნის ბაზიდან, თავისუფალი ოთახის ტიპები და ცხოვრების წინასწარი ფასი სასტუმროს გამოქვეყნებული ხელმისაწვდომობიდან. რა არის ჩართული — წყვეტს სასტუმრო; აქ არაფერი იჯავშნება — ჯავშანი ფორმდება სასტუმროს დაჯავშნის ფორმაში.","x-displayName":"სასტუმრო"},{"name":"Carts","description":"აგენტის კალათები — შეკვეთის ეტაპობრივი აწყობა; ფასები ყოველთვის ცოცხალი მენიუდან გადაითვლება, ამიტომ კალათა მოძველებულ ფასს ვერ აჩვენებს. კალათის ყოველი ხედი შეიცავს checkoutUrl-ს, რომ შეკვეთა ადამიანს ჩვეულებრივ ვებ-გადახდაზე გადაეცეს. კალათა ცოცხლობს 7 დღეს.","x-displayName":"კალათები"},{"name":"Orders","description":"შეკვეთის ვალიდაცია და გაფორმება (inline-პოზიციები ან კალათიდან), შემდეგ თვალყურის დევნება orderId-ით. მხარს უჭერს idempotencyKey-ს გამეორებისგან დასაცავად (48-საათიანი ფანჯარა).","x-displayName":"შეკვეთები"},{"name":"Reservations","description":"თავისუფალი/დაკავებული მაგიდები გამოქვეყნებულ დარბაზის გეგმაზე და ჯავშნის სასიცოცხლო ციკლი: მოთხოვნა, სტატუსის თვალყურის დევნება (pending, სანამ რესტორანი დაადასტურებს), გაუქმება.","x-displayName":"ჯავშნები"}],"paths":{"/locations/{domain}/menu":{"get":{"operationId":"getMenu","tags":["Menu"],"summary":"ობიექტის სრული მენიუ ფასებით, ოფციებითა და შეკვეთის შესაძლებლობებით","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"ობიექტის დომენის კოდი (დიდი ასოებით, მაგ. MYCAFE)"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en"},"description":"მენიუს ენა (ISO 639-1); ნაგულისხმევად — en"}],"responses":{"200":{"description":"მენიუ"},"404":{"description":"უცნობი ობიექტი"}}}},"/locations/{domain}/items/{itemId}":{"get":{"operationId":"getItem","tags":["Menu"],"summary":"მენიუს ერთი პოზიცია ვარიანტების ჯგუფებითა და დამატებებით","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"ობიექტის დომენის კოდი (დიდი ასოებით, მაგ. MYCAFE)"},{"name":"itemId","in":"path","required":true,"schema":{"type":"string"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en"},"description":"მენიუს ენა (ISO 639-1); ნაგულისხმევად — en"}],"responses":{"200":{"description":"პოზიცია"},"404":{"description":"ვერ მოიძებნა"}}}},"/locations/{domain}/items":{"get":{"operationId":"getItemsBulk","tags":["Menu"],"summary":"10-მდე პოზიციის ჯგუფური მიღება id-ით","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"ობიექტის დომენის კოდი (დიდი ასოებით, მაგ. MYCAFE)"},{"name":"ids","in":"query","required":true,"schema":{"type":"string"},"description":"პოზიციების id-ები მძიმით გამოყოფილი (მაქს. 10)"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en"},"description":"მენიუს ენა (ISO 639-1); ნაგულისხმევად — en"}],"responses":{"200":{"description":"{items: [...], notFound: [...]}"},"400":{"description":"id-ები აკლია ან ზედმეტად ბევრია"},"404":{"description":"უცნობი ობიექტი"}}}},"/locations/{domain}/carts":{"post":{"operationId":"createCart","tags":["Carts"],"summary":"აგენტის კალათის შექმნა (სურვილისამებრ პოზიციებით შევსებული)","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"ობიექტის დომენის კოდი (დიდი ასოებით, მაგ. MYCAFE)"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"lines":{"type":"array","description":"იგივე ფორმა, რაც updates[] — თითო ჩანაწერი ამატებს სტრიქონს","items":{"type":"object","required":["itemId"],"properties":{"itemId":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":99,"default":1},"variants":{"type":"object","additionalProperties":{"type":"string"}},"addons":{"type":"array","items":{"type":"string"}},"comment":{"type":"string"}}}},"language":{"type":"string"}}}}}},"responses":{"201":{"description":"კალათის ხედი: {cartId, lines, subtotal, checkoutUrl, …}"},"400":{"description":"ვალიდაცია ვერ გაიარა"},"503":{"description":"კალათების საცავი ამ ობიექტისთვის მიუწვდომელია"}}}},"/locations/{domain}/carts/{cartId}":{"get":{"operationId":"getCart","tags":["Carts"],"summary":"კალათა ცოცხალი მენიუდან გადათვლილი ფასებით (cartId — წვდომის ტოკენი)","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"ობიექტის დომენის კოდი (დიდი ასოებით, მაგ. MYCAFE)"},{"name":"cartId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"კალათის ხედი"},"404":{"description":"ვერ მოიძებნა ან ვადა გაუვიდა"}}},"patch":{"operationId":"updateCart","tags":["Carts"],"summary":"კალათის სტრიქონების დამატება / შეცვლა / წაშლა","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"ობიექტის დომენის კოდი (დიდი ასოებით, მაგ. MYCAFE)"},{"name":"cartId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["updates"],"properties":{"updates":{"type":"array","items":{"type":"object","properties":{"lineId":{"type":"string","description":"არსებული სტრიქონი შესაცვლელად; გამოტოვეთ ახლის დასამატებლად"},"itemId":{"type":"string","description":"სავალდებულოა სტრიქონის დამატებისას"},"quantity":{"type":"integer","minimum":0,"maximum":99,"description":"0 შლის სტრიქონს (lineId-თან ერთად)"},"variants":{"type":"object","additionalProperties":{"type":"string"}},"addons":{"type":"array","items":{"type":"string"}},"comment":{"type":"string"}}}}}}}}},"responses":{"200":{"description":"განახლებული კალათის ხედი"},"400":{"description":"ვალიდაცია ვერ გაიარა"},"404":{"description":"ვერ მოიძებნა ან ვადა გაუვიდა"},"409":{"description":"კალათაზე შეკვეთა უკვე გაფორმებულია"}}}},"/locations/{domain}/store-info":{"get":{"operationId":"getStoreInfo","tags":["Store"],"summary":"ინფორმაცია დაწესებულებაზე: სამუშაო საათები (+openNow დაწესებულების დროის სარტყელში), კონტაქტები, მიტანა/თვითგატანა, გადახდა, გაგზავნა/დაბრუნება და გამოქვეყნებული იურიდიული დოკუმენტები","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"ობიექტის დომენის კოდი (დიდი ასოებით, მაგ. MYCAFE)"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en"},"description":"მენიუს ენა (ISO 639-1); ნაგულისხმევად — en"}],"responses":{"200":{"description":"ინფორმაცია დაწესებულებაზე"},"404":{"description":"უცნობი ობიექტი"}}}},"/locations/{domain}/hotel/info":{"get":{"operationId":"getHotelInfo","tags":["Hotel"],"summary":"სტუმრის კითხვაზე პასუხი სასტუმროს სტუმრების ცოდნის ბაზიდან (მხოლოდ ფაქტები, ფასების გარეშე)","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"ობიექტის დომენის კოდი (დიდი ასოებით, მაგ. MYCAFE)"},{"name":"q","in":"query","required":true,"schema":{"type":"string"},"description":"კითხვა, ნებისმიერ ენაზე"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en"},"description":"მენიუს ენა (ISO 639-1); ნაგულისხმევად — en"}],"responses":{"200":{"description":"{ok, asOf, revision, data: {answer, sources}} or {ok: false, reason}"},"400":{"description":"არასწორი პარამეტრები"},"403":{"description":"სასტუმრომ ეს არ ჩართო (მიზეზის კოდი — error-ში)"}}}},"/locations/{domain}/hotel/availability":{"get":{"operationId":"getHotelAvailability","tags":["Hotel"],"summary":"თავისუფალი ოთახის ტიპები თარიღებზე — სასტუმროს გამოქვეყნებული ხელმისაწვდომობიდან","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"ობიექტის დომენის კოდი (დიდი ასოებით, მაგ. MYCAFE)"},{"name":"checkIn","in":"query","required":true,"schema":{"type":"string","format":"date"},"description":"შესვლის თარიღი YYYY-MM-DD"},{"name":"checkOut","in":"query","required":true,"schema":{"type":"string","format":"date"},"description":"გასვლის თარიღი YYYY-MM-DD"},{"name":"adults","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"ზრდასრულები"},{"name":"children","in":"query","schema":{"type":"integer","minimum":0,"default":0},"description":"ბავშვები"}],"responses":{"200":{"description":"{ok, asOf, revision, data: {roomTypes: [...]}} or {ok: false, reason}"},"400":{"description":"არასწორი პარამეტრები"},"403":{"description":"სასტუმრომ ეს არ ჩართო (მიზეზის კოდი — error-ში)"}}}},"/locations/{domain}/hotel/quote":{"get":{"operationId":"quoteHotelStay","tags":["Hotel"],"summary":"ცხოვრების წინასწარი ფასი თარიღებზე (საბოლოო — სასტუმროს დაჯავშნის ფორმაში)","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"ობიექტის დომენის კოდი (დიდი ასოებით, მაგ. MYCAFE)"},{"name":"roomTypeId","in":"query","schema":{"type":"string"},"description":"Room type id from availability; omit to quote every room type (data.roomTypes[] with quote or reason)"},{"name":"ratePlanId","in":"query","schema":{"type":"string"},"description":"ტარიფის id (არასავალდებულო)"},{"name":"checkIn","in":"query","required":true,"schema":{"type":"string","format":"date"},"description":"შესვლის თარიღი YYYY-MM-DD"},{"name":"checkOut","in":"query","required":true,"schema":{"type":"string","format":"date"},"description":"გასვლის თარიღი YYYY-MM-DD"},{"name":"adults","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"ზრდასრულები"},{"name":"children","in":"query","schema":{"type":"integer","minimum":0,"default":0},"description":"ბავშვები"}],"responses":{"200":{"description":"{ok, asOf, revision, data: {total, currency, nights, ...}} or {ok: false, reason}"},"400":{"description":"არასწორი პარამეტრები"},"403":{"description":"სასტუმრომ ეს არ ჩართო (მიზეზის კოდი — error-ში)"}}}},"/locations/{domain}/policies":{"get":{"operationId":"searchPoliciesAndFaqs","tags":["Store"],"summary":"ძებნა ობიექტის პოლიტიკებში, FAQ-სა და საინფორმაციო გვერდებზე","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"ობიექტის დომენის კოდი (დიდი ასოებით, მაგ. MYCAFE)"},{"name":"q","in":"query","required":true,"schema":{"type":"string"},"description":"კითხვა, ნებისმიერ ენაზე"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en"},"description":"მენიუს ენა (ISO 639-1); ნაგულისხმევად — en"},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":10,"default":5}}],"responses":{"200":{"description":"{results: [{source, title, snippet, url}]}"},"400":{"description":"აკლია query-პარამეტრი q"}}}},"/locations/{domain}/search":{"get":{"operationId":"searchProducts","tags":["Menu"],"summary":"პროდუქტების სემანტიკური ძებნა ობიექტის კატალოგში (სახელები, აღწერები, მახასიათებლები, ბრენდი, SKU/შტრიხკოდები)","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"ობიექტის დომენის კოდი (დიდი ასოებით, მაგ. MYCAFE)"},{"name":"q","in":"query","required":true,"schema":{"type":"string"},"description":"რას ეძებთ, ნებისმიერ ენაზე"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en"},"description":"მენიუს ენა (ISO 639-1); ნაგულისხმევად — en"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":10,"default":6},"description":"რამდენი პოზიცია დაბრუნდეს"}],"responses":{"200":{"description":"ნაპოვნი პოზიციები რელევანტურობის ქულებით (ან შენიშვნა მიუწვდომლობაზე/ცარიელ შედეგზე)"},"400":{"description":"აკლია query-პარამეტრი q"}}}},"/locations/{domain}/orders":{"post":{"operationId":"createOrder","tags":["Orders"],"summary":"შეკვეთის ვალიდაცია და გაფორმება","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"ობიექტის დომენის კოდი (დიდი ასოებით, მაგ. MYCAFE)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"გადმოეცით ან items[], ან cartId (ურთიერთგამომრიცხავია)","properties":{"items":{"type":"array","items":{"type":"object","required":["itemId"],"properties":{"itemId":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":99,"default":1},"variants":{"type":"object","additionalProperties":{"type":"string"},"description":"variantGroupId → variantId (გამოტოვებისას გამოიყენება ნაგულისხმევი მნიშვნელობები)"},"addons":{"type":"array","items":{"type":"string"}}}}},"cartId":{"type":"string","description":"აგენტის კალათის შიგთავსის შეკვეთა inline-პოზიციების ნაცვლად"},"idempotencyKey":{"type":"string","minLength":8,"maxLength":64,"description":"გამეორებისგან დაცვა: იგივე გასაღები 48 საათში აბრუნებს თავდაპირველ შეკვეთას"},"orderType":{"type":"string","enum":["dine-in","delivery","pickup"]},"customer":{"type":"object","properties":{"name":{"type":"string"},"phone":{"type":"string","description":"E.164, მაგ. +995555123456"},"email":{"type":"string"}}},"delivery":{"type":"object","properties":{"address":{"type":"string"},"notes":{"type":"string"}}},"pickup":{"type":"object","properties":{"scheduledFor":{"type":"string","format":"date-time"}}},"paymentMethod":{"type":"string","enum":["cash","card-on-delivery","online"]},"notes":{"type":"string"},"qrCode":{"type":"string","description":"მაგიდის QR კლიენტის კოდი დარბაზში შეკვეთებისთვის"},"language":{"type":"string"}}}}}},"responses":{"201":{"description":"შეკვეთა მიღებულია: {orderId, total, statusUrl}"},"400":{"description":"ვალიდაცია ვერ გაიარა: {error, details[]}"}}}},"/locations/{domain}/orders/{orderId}":{"get":{"operationId":"getOrderStatus","tags":["Orders"],"summary":"შეკვეთის სტატუსი id-ით (id წვდომის ტოკენია)","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"ობიექტის დომენის კოდი (დიდი ასოებით, მაგ. MYCAFE)"},{"name":"orderId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"შეკვეთის სტატუსი"},"404":{"description":"ვერ მოიძებნა"}}}},"/locations/{domain}/reservations/availability":{"get":{"operationId":"getTableAvailability","tags":["Reservations"],"summary":"გამოქვეყნებული დარბაზის გეგმის თავისუფალი/დაკავებული მაგიდები დროის ფანჯრისთვის","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"ობიექტის დომენის კოდი (დიდი ასოებით, მაგ. MYCAFE)"},{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"durationMinutes","in":"query","schema":{"type":"integer","default":120}}],"responses":{"200":{"description":"{tables: [{id, label, seats, hall, busy}]}"},"400":{"description":"დარბაზის გეგმა არ არის გამოქვეყნებული / არასწორი start"}}}},"/locations/{domain}/reservations":{"post":{"operationId":"createReservation","tags":["Reservations"],"summary":"მაგიდის დაჯავშნის მოთხოვნა (pending, სანამ რესტორანი დაადასტურებს)","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"ობიექტის დომენის კოდი (დიდი ასოებით, მაგ. MYCAFE)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["start","name"],"properties":{"start":{"type":"string","format":"date-time"},"durationMinutes":{"type":"integer","minimum":30,"maximum":600,"default":120},"partySize":{"type":"integer","minimum":1,"maximum":50,"default":2},"name":{"type":"string"},"phone":{"type":"string"},"comment":{"type":"string"},"tableId":{"type":"string","description":"მაგიდის id დარბაზის გეგმიდან (availability-დან)"},"codeId":{"type":"string","description":"მაგიდის QR კლიენტის კოდი (ალტერნატიული მიბმა)"},"idempotencyKey":{"type":"string","minLength":8,"maxLength":64,"description":"Retry guard: the same key returns the original reservation instead of a second one"}}}}}},"responses":{"200":{"description":"Idempotent replay: the original reservation ({idempotentReplay: true})"},"201":{"description":"ჯავშანი მოთხოვნილია: {reservationId, status: pending, statusUrl}"},"400":{"description":"ვალიდაცია ვერ გაიარა"}}}},"/locations/{domain}/reservations/{reservationId}":{"get":{"operationId":"getReservationStatus","tags":["Reservations"],"summary":"ჯავშნის სტატუსი (pending/confirmed/seated ან unknown)","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"ობიექტის დომენის კოდი (დიდი ასოებით, მაგ. MYCAFE)"},{"name":"reservationId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"სტატუსი"}}},"delete":{"operationId":"cancelReservation","tags":["Reservations"],"summary":"ჯავშნის გაუქმება (id წვდომის ტოკენია)","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"ობიექტის დომენის კოდი (დიდი ასოებით, მაგ. MYCAFE)"},{"name":"reservationId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"გაუქმება გაგზავნილია"}}}}}}