{"openapi":"3.1.0","info":{"title":"meni.ge LLM API","version":"1.0.0","description":"Menu access and order placement for AI assistants/agents."},"servers":[{"url":"https://api.meni.ge/llm/v1"}],"paths":{"/locations/{domain}/menu":{"get":{"operationId":"getMenu","summary":"Full menu of a location with prices, options and ordering capabilities","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"Location domain code (uppercase, e.g. MYCAFE)"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en"},"description":"Menu language (ISO 639-1); falls back to en"}],"responses":{"200":{"description":"Menu"},"404":{"description":"Unknown location"}}}},"/locations/{domain}/items/{itemId}":{"get":{"operationId":"getItem","summary":"Single menu item with variant groups and addons","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"Location domain code (uppercase, e.g. MYCAFE)"},{"name":"itemId","in":"path","required":true,"schema":{"type":"string"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en"},"description":"Menu language (ISO 639-1); falls back to en"}],"responses":{"200":{"description":"Item"},"404":{"description":"Not found"}}}},"/locations/{domain}/orders":{"post":{"operationId":"createOrder","summary":"Validate and place an order","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"Location domain code (uppercase, e.g. MYCAFE)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["items"],"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 (defaults applied when omitted)"},"addons":{"type":"array","items":{"type":"string"}}}}},"orderType":{"type":"string","enum":["dine-in","delivery","pickup"]},"customer":{"type":"object","properties":{"name":{"type":"string"},"phone":{"type":"string","description":"E.164, e.g. +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":"Table QR client code for dine-in orders"},"language":{"type":"string"}}}}}},"responses":{"201":{"description":"Order accepted: {orderId, total, statusUrl}"},"400":{"description":"Validation failed: {error, details[]}"}}}},"/locations/{domain}/orders/{orderId}":{"get":{"operationId":"getOrderStatus","summary":"Order status by id (the id acts as the access token)","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"Location domain code (uppercase, e.g. MYCAFE)"},{"name":"orderId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Order status"},"404":{"description":"Not found"}}}},"/locations/{domain}/reservations/availability":{"get":{"operationId":"getTableAvailability","summary":"Free/busy tables of the published floor plan for a time window","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"Location domain code (uppercase, e.g. 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":"No floor plan published / invalid start"}}}},"/locations/{domain}/reservations":{"post":{"operationId":"createReservation","summary":"Request a table reservation (pending until the restaurant confirms)","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"Location domain code (uppercase, e.g. 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":"Floor plan table id from availability"},"codeId":{"type":"string","description":"Table QR client code (alternative binding)"}}}}}},"responses":{"201":{"description":"Reservation requested: {reservationId, status: pending, statusUrl}"},"400":{"description":"Validation failed"}}}},"/locations/{domain}/reservations/{reservationId}":{"get":{"operationId":"getReservationStatus","summary":"Reservation status (pending/confirmed/seated or unknown)","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"Location domain code (uppercase, e.g. MYCAFE)"},{"name":"reservationId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Status"}}},"delete":{"operationId":"cancelReservation","summary":"Cancel a reservation (the id acts as the access token)","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"Location domain code (uppercase, e.g. MYCAFE)"},{"name":"reservationId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Cancellation submitted"}}}}}}