# ManuBBQ > ManuBBQ is a barbecue restaurant in Ploiești, Romania. AI agents (ChatGPT, Claude, Grok, Perplexity, etc.) can read the menu and place pickup or delivery orders for a human. The human always pays on a Stripe-hosted page; agents never handle card data. ## Connect - MCP (Streamable HTTP, no auth): https://manubbq.ro/mcp (7 tools: get_menu, get_availability, check_delivery, quote_order, place_order, get_order_status, cancel_order) - REST + OpenAPI 3.1: https://manubbq.ro/api/v1/openapi.json (base https://manubbq.ro/api/v1/agent) - Docs: https://manubbq.ro/developers. Full guide: https://manubbq.ro/llms-full.txt ## Site (Romanian) - FAQ: https://manubbq.ro/intrebari-frecvente (hours, minimum order, delivery area, payment, pickup addresses, catering) - Menu: https://manubbq.ro/menu. Contact: https://manubbq.ro/contact. Sitemap: https://manubbq.ro/sitemap.xml - Mici & grill (live prices): https://manubbq.ro/mici-ploiesti. Ciorbe (live prices): https://manubbq.ro/ciorba-ploiesti - Ordering through AI assistants (RO + EN summary): https://manubbq.ro/comanda-prin-asistenti-ai ## Flow 1. get_menu (GET /api/v1/agent/menu): item ids, RON prices, option groups, allergens if published. 2. get_availability (GET /api/v1/agent/availability): check isOpen, lastOrderTime and minOrderRon. 3. Delivery only: check_delivery (POST /api/v1/agent/delivery/check) with {"street":"Strada X 12","city":"Ploiești"}. 4. quote_order (POST /api/v1/agent/quote): server-computed lines and totalRon; if orderable is false, the minimum order is not met (minimumOrder.shortfallRon). 5. Show the human the items and total. Get an explicit "yes". 6. place_order (POST /api/v1/agent/orders): same cart + customer {name,email,phone} + a fresh idempotency key (header Idempotency-Key, or idempotency_key in MCP). Send expectedTotalRon from the quote. 7. Give the human the paymentUrl. The kitchen gets the order only after they pay. 8. get_order_status (GET /api/v1/agent/orders/{orderNumber} with X-Order-Token: ): poll at most every 30 s. 9. Only if the human asks to cancel before paying: cancel_order (POST /api/v1/agent/orders/{orderNumber}/cancel with X-Order-Token, optional {"reason":"..."} up to 200 chars). If it returns 409 order_not_cancellable (already paid or in the kitchen), give the human the phone and email from error.hint. ## Rules - Never place an order the human has not confirmed. Use their real contact details. - The human must pay via the paymentUrl. Card only; no cash, promo codes or reward points. - Minimum order: 50 RON, counted on the items subtotal (items + options, before delivery fee and discounts). quote_order reports minimumOrder {minOrderRon, met, shortfallRon} and orderable=false when it is not met; place_order then returns 422 below_minimum_order (details.shortfallRon), so ask the human to add items first. Last orders: 22:00 Europe/Bucharest time. From 22:00 until midnight get_availability shows isOpen=false, reason after_last_order, and quote_order/place_order return 409 ordering_closed (not retryable tonight). - Orders cannot be changed via the API. cancel_order works only while the order is unpaid and not yet sent to the kitchen. The server re-checks Stripe and expires the payment link first; paid or in-kitchen orders return 409 order_not_cancellable with the restaurant's phone and email. Repeating it on a cancelled order returns that order. - Unpaid orders expire: the payment link is valid for AGENT_CHECKOUT_EXPIRES_MIN minutes (default 60) and the order is then automatically cancelled (status expired); paid orders are never touched. Phone numbers must be E.164 (+40712345678) or Romanian national format (0712 345 678) and are stored as E.164. The restaurant can pause agent ordering (place_order returns 503 ordering_paused) while menu, quotes, status and cancel keep working. All endpoints are public: an API key is optional and only raises rate limits. - Restaurant contact (for paid orders, changes, allergies): phone +40373816805, email info@manubbq.ro. - Keep statusToken private; it identifies the order. ## Limits - Max 20 distinct items, 20 per item, 1500 RON per order. Bodies max 16 KB. Unknown fields are rejected. - Rate limits per IP: 60 reads/min, 20 writes/min (delivery checks, quotes, cancels), 3 orders/min and 10/hour. On 429 wait Retry-After seconds. - Errors: {"error":{"code","message","hint","retryable"}}. Follow hint; retry only if retryable. All 34 codes with HTTP status: https://manubbq.ro/llms-full.txt - Contract version 1.0.0 (the v1 in the paths).