{"openapi":"3.1.0","info":{"title":"Nexus Website Ordering API","description":"Connect restaurant websites to Nexus Retail. Start at /docs. All amounts are integer bani (RON). Website keys are scoped to one tenant; each request explicitly selects an enabled POS connection.","version":"1.0.0"},"paths":{"/health":{"get":{"summary":"Check process liveness","operationId":"getHealth","responses":{"200":{"description":"The gateway process is running.","content":{"application/json":{"schema":{}}}}},"tags":["Operations"],"description":"Returns 200 while the gateway process is running. Needs no key. It doesn't check menus or the restaurant's systems."}},"/v1/connections":{"get":{"summary":"Discover enabled points of sale","operationId":"listConnections","responses":{"200":{"description":"Connections enabled for your website key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionList"}}}},"401":{"description":"Missing, invalid or wrong-role key.","content":{"application/json":{"schema":{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},"example":{"detail":"invalid_credentials"}}},"headers":{"WWW-Authenticate":{"schema":{"type":"string","example":"Bearer"}}}},"503":{"description":"Outcome unconfirmed. Retry after at least 5 seconds; preserve order ID and body.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string"}}},{"type":"object","required":["error"],"properties":{"error":{"type":"string","const":"storage_unavailable"}}}]},"example":{"error":"storage_unavailable"}}},"headers":{"Retry-After":{"description":"Minimum delay in seconds.","schema":{"type":"string","example":"5"}}}},"429":{"description":"Rate limit exceeded. Wait Retry-After seconds and retry the identical request.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/json":{"example":{"error":"rate_limit_exceeded"}}}}},"security":[{"WebsiteKey":[]}],"tags":["Connections"],"description":"Lists the locations and registers that can receive orders with your website key. Use a connection's id in every menu, order and status request, even when there is only one. An empty list means the restaurant hasn't enabled website ordering yet."}},"/v1/connections/{connection_id}/menu":{"get":{"summary":"Read the restaurant menu","operationId":"getMenu","security":[{"WebsiteKey":[]}],"parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,100}$","title":"Connection Id"}},{"name":"fulfillment_at","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Fulfillment At"}}],"responses":{"200":{"description":"The published menu for this connection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Menu"},"example":{"revision":"example-menu-1","currency":"RON","accepting_orders":true,"fulfillment":["pickup","delivery"],"delivery_fee":700,"categories":[{"id":"pizzas","name":"Pizza"},{"id":"meals","name":"Meals"}],"products":[{"id":"pizza-margherita","category_id":"pizzas","name":"Margherita","description":"Tomato, mozzarella and basil","image_url":"https://images.example.test/margherita.jpg","translations":{"en":{"name":"Margherita","description":"Tomato, mozzarella and basil"},"ro":{"name":"Margherita","description":"Roșii, mozzarella și busuioc"}},"price":3200,"packaging":100,"packaging_product_id":"pizza-box","modifier_groups":[{"id":"pizza-extras","name":"Extras","kind":"extra","minimum":0,"maximum":1,"options":[{"id":"cheese","name":"Extra cheese","price":400}]}]},{"id":"burger-meal","category_id":"meals","name":"Burger meal","description":"Burger, fries and your choice of drink","translations":{"en":{"name":"Burger meal","description":"Burger, fries and your choice of drink"},"ro":{"name":"Meniu burger","description":"Burger, cartofi prăjiți și băutură la alegere"}},"price":2500,"packaging":100,"packaging_product_id":"meal-bag","modifier_groups":[{"id":"size","name":"Size","kind":"variant","minimum":1,"maximum":1,"options":[{"id":"regular","name":"Regular","price":0},{"id":"large","name":"Large","price":0}]},{"id":"drink","name":"Drink","kind":"bundle","minimum":1,"maximum":1,"options":[{"id":"water","name":"Water","price":0,"deposit":50}]},{"id":"meal-extras","name":"Extras","kind":"extra","minimum":0,"maximum":1,"options":[{"id":"sauce","name":"Extra sauce","price":200}]}],"variants":[{"id":"meal-regular","selections":[{"group_id":"size","option_id":"regular"}],"price":2500},{"id":"meal-large","selections":[{"group_id":"size","option_id":"large"}],"price":3000}]}]}}}},"422":{"description":"Invalid input. Field paths and types are returned; input values are omitted.","content":{"application/json":{"schema":{"type":"object","title":"ValidationError","required":["error","fields"],"properties":{"error":{"type":"string"},"fields":{"type":"array","items":{"type":"object","required":["path","type"],"properties":{"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"integer"}]}},"type":{"type":"string"}}}}}},"example":{"error":"invalid_request","fields":[{"path":["body","total"],"type":"int_type"}]}}}},"401":{"description":"Missing, invalid or wrong-role key.","content":{"application/json":{"schema":{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},"example":{"detail":"invalid_credentials"}}},"headers":{"WWW-Authenticate":{"schema":{"type":"string","example":"Bearer"}}}},"404":{"description":"Connection unavailable to this tenant, or the requested menu/order does not exist.","content":{"application/json":{"schema":{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},"example":{"detail":"menu_not_published"}}}},"409":{"description":"Conflict, such as an outdated menu revision or a sold-out item. The error code says what to change.","content":{"application/json":{"schema":{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string"}}},"example":{"error":"scheduled_time_unavailable"}}}},"503":{"description":"Outcome unconfirmed. Retry after at least 5 seconds; preserve order ID and body.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string"}}},{"type":"object","required":["error"],"properties":{"error":{"type":"string","const":"storage_unavailable"}}}]},"example":{"error":"storage_unavailable"}}},"headers":{"Retry-After":{"description":"Minimum delay in seconds.","schema":{"type":"string","example":"5"}}}},"429":{"description":"Rate limit exceeded. Wait Retry-After seconds and retry the identical request.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/json":{"example":{"error":"rate_limit_exceeded"}}}}},"tags":["Menu"],"description":"Returns the menu published for this connection. Amounts are integer bani. Send the revision and IDs from this menu in the order. Availability and accepting_orders can change without a new revision, so fetch the menu again just before checkout."}},"/v1/menu":{"put":{"summary":"Publish a complete menu","operationId":"publishMenu","security":[{"PublisherKey":[]}],"parameters":[{"name":"x-website-publication","in":"header","required":true,"schema":{"type":"integer","maximum":9223372036854775807,"minimum":1,"title":"X-Website-Publication"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Menu"},"example":{"revision":"example-menu-1","currency":"RON","accepting_orders":true,"fulfillment":["pickup","delivery"],"delivery_fee":700,"categories":[{"id":"pizzas","name":"Pizza"},{"id":"meals","name":"Meals"}],"products":[{"id":"pizza-margherita","category_id":"pizzas","name":"Margherita","description":"Tomato, mozzarella and basil","image_url":"https://images.example.test/margherita.jpg","translations":{"en":{"name":"Margherita","description":"Tomato, mozzarella and basil"},"ro":{"name":"Margherita","description":"Roșii, mozzarella și busuioc"}},"price":3200,"packaging":100,"packaging_product_id":"pizza-box","modifier_groups":[{"id":"pizza-extras","name":"Extras","kind":"extra","minimum":0,"maximum":1,"options":[{"id":"cheese","name":"Extra cheese","price":400}]}]},{"id":"burger-meal","category_id":"meals","name":"Burger meal","description":"Burger, fries and your choice of drink","translations":{"en":{"name":"Burger meal","description":"Burger, fries and your choice of drink"},"ro":{"name":"Meniu burger","description":"Burger, cartofi prăjiți și băutură la alegere"}},"price":2500,"packaging":100,"packaging_product_id":"meal-bag","modifier_groups":[{"id":"size","name":"Size","kind":"variant","minimum":1,"maximum":1,"options":[{"id":"regular","name":"Regular","price":0},{"id":"large","name":"Large","price":0}]},{"id":"drink","name":"Drink","kind":"bundle","minimum":1,"maximum":1,"options":[{"id":"water","name":"Water","price":0,"deposit":50}]},{"id":"meal-extras","name":"Extras","kind":"extra","minimum":0,"maximum":1,"options":[{"id":"sauce","name":"Extra sauce","price":200}]}],"variants":[{"id":"meal-regular","selections":[{"group_id":"size","option_id":"regular"}],"price":2500},{"id":"meal-large","selections":[{"group_id":"size","option_id":"large"}],"price":3000}]}]}}}},"responses":{"204":{"description":"The menu was published, or an identical copy was already published."},"422":{"description":"Invalid input. Field paths and types are returned; input values are omitted.","content":{"application/json":{"schema":{"type":"object","title":"ValidationError","required":["error","fields"],"properties":{"error":{"type":"string"},"fields":{"type":"array","items":{"type":"object","required":["path","type"],"properties":{"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"integer"}]}},"type":{"type":"string"}}}}}},"example":{"error":"invalid_request","fields":[{"path":["body","total"],"type":"int_type"}]}}}},"401":{"description":"Missing, invalid or wrong-role key.","content":{"application/json":{"schema":{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},"example":{"detail":"invalid_credentials"}}},"headers":{"WWW-Authenticate":{"schema":{"type":"string","example":"Bearer"}}}},"409":{"description":"Conflict, such as an outdated menu revision or a sold-out item. The error code says what to change.","content":{"application/json":{"schema":{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string"}}},"example":{"error":"revision_already_used"}}}},"413":{"description":"Request body exceeds 4 MiB.","content":{"application/json":{"schema":{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string"}}},"example":{"error":"body_too_large"}}}},"503":{"description":"Outcome unconfirmed. Retry after at least 5 seconds; preserve order ID and body.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string"}}},{"type":"object","required":["error"],"properties":{"error":{"type":"string","const":"storage_unavailable"}}}]},"example":{"error":"storage_unavailable"}}},"headers":{"Retry-After":{"description":"Minimum delay in seconds.","schema":{"type":"string","example":"5"}}}},"429":{"description":"Rate limit exceeded. Wait Retry-After seconds and retry the identical request.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/json":{"example":{"error":"rate_limit_exceeded"}}}}},"tags":["Publishing"],"description":"Used by Nexus Retail with a publisher key; website integrations never call it. Revisions are immutable. Include the required positive X-Website-Publication generation. An identical retry with the same generation is idempotent unless a newer generation has arrived; obsolete generations or changed contents under the same generation return 409 publication_superseded."}},"/v1/connections/{connection_id}/orders":{"post":{"summary":"Submit an order","operationId":"submitOrder","security":[{"WebsiteKey":[]}],"parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,100}$","title":"Connection Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderRequest"},"examples":{"pickup":{"summary":"Pizza pickup, paid online","value":{"external_order_id":"shop-1001","menu_revision":"example-menu-1","currency":"RON","fulfillment":"pickup","customer":{"name":"Example Customer","phone":"0700000000"},"payment":{"method":"paid_online","reference":"payment-example-1001"},"items":[{"product_id":"pizza-margherita","quantity":1,"modifiers":[{"group_id":"pizza-extras","option_id":"cheese"}],"notes":"Please slice the pizza"}],"total":3700,"notes":"Pickup by Alex"}},"delivery":{"summary":"Two bundle meals, cash on delivery","value":{"external_order_id":"shop-1002","menu_revision":"example-menu-1","currency":"RON","fulfillment":"delivery","customer":{"name":"Example Customer","phone":"0700000000"},"address":{"city":"Iași","street":"Example Street 10","details":"Apartment 2, ring the bell"},"payment":{"method":"cash_on_fulfillment"},"items":[{"product_id":"burger-meal","quantity":2,"modifiers":[{"group_id":"size","option_id":"large"},{"group_id":"drink","option_id":"water"},{"group_id":"meal-extras","option_id":"sauce"}]}],"total":7400}}}}}},"responses":{"201":{"description":"The restaurant received the order; it is waiting for staff to accept it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderReceipt"},"example":{"external_order_id":"shop-1001","status":"pending_acceptance","total":3700,"currency":"RON"}}}},"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderReceipt"},"example":{"external_order_id":"shop-1001","status":"pending_acceptance","total":3700,"currency":"RON"}}},"description":"The identical order was already received; returns its original receipt."},"409":{"description":"Conflict, such as an outdated menu revision or a sold-out item. The error code says what to change.","content":{"application/json":{"schema":{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string"}}},"example":{"error":"menu_changed"}}}},"503":{"description":"Outcome unconfirmed. Retry after at least 5 seconds; preserve order ID and body.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","title":"Error","required":["error","retry_same_order_id"],"properties":{"error":{"type":"string"},"retry_same_order_id":{"type":"boolean"}}},{"type":"object","required":["error"],"properties":{"error":{"type":"string","const":"storage_unavailable"}}}]},"example":{"error":"retail_unavailable","retry_same_order_id":true}}},"headers":{"Retry-After":{"description":"Minimum delay in seconds.","schema":{"type":"string","example":"5"}}}},"422":{"description":"Invalid input. Field paths and types are returned; input values are omitted.","content":{"application/json":{"schema":{"type":"object","title":"ValidationError","required":["error","fields"],"properties":{"error":{"type":"string"},"fields":{"type":"array","items":{"type":"object","required":["path","type"],"properties":{"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"integer"}]}},"type":{"type":"string"}}}}}},"example":{"error":"invalid_request","fields":[{"path":["body","total"],"type":"int_type"}]}}}},"401":{"description":"Missing, invalid or wrong-role key.","content":{"application/json":{"schema":{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},"example":{"detail":"invalid_credentials"}}},"headers":{"WWW-Authenticate":{"schema":{"type":"string","example":"Bearer"}}}},"413":{"description":"Request body exceeds 4 MiB.","content":{"application/json":{"schema":{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string"}}},"example":{"error":"body_too_large"}}}},"404":{"description":"Connection unavailable to this tenant, or the requested menu/order does not exist.","content":{"application/json":{"schema":{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},"example":{"detail":"connection_not_found"}}}},"429":{"description":"Rate limit exceeded. Wait Retry-After seconds and retry the identical request.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/json":{"example":{"error":"rate_limit_exceeded"}}}}},"tags":["Orders"],"description":"Sends an order to the restaurant. 201 means the restaurant received it; staff still have to accept it. Resending the identical request returns 200 with the original receipt and never creates a second order. After a timeout or 503, resend the same external_order_id and body. Receive progress through webhooks; use GET to reconcile missed updates or when webhooks are unavailable."}},"/v1/connections/{connection_id}/orders/{external_order_id}":{"get":{"summary":"Read current order status","operationId":"getOrder","security":[{"WebsiteKey":[]}],"parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,100}$","title":"Connection Id"}},{"name":"external_order_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]+$","title":"External Order Id"}}],"responses":{"200":{"description":"The order's current status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderReceipt"},"example":{"external_order_id":"shop-1001","status":"accepted","total":3700,"currency":"RON"}}}},"422":{"description":"Invalid input. Field paths and types are returned; input values are omitted.","content":{"application/json":{"schema":{"type":"object","title":"ValidationError","required":["error","fields"],"properties":{"error":{"type":"string"},"fields":{"type":"array","items":{"type":"object","required":["path","type"],"properties":{"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"integer"}]}},"type":{"type":"string"}}}}}},"example":{"error":"invalid_request","fields":[{"path":["body","total"],"type":"int_type"}]}}}},"401":{"description":"Missing, invalid or wrong-role key.","content":{"application/json":{"schema":{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},"example":{"detail":"invalid_credentials"}}},"headers":{"WWW-Authenticate":{"schema":{"type":"string","example":"Bearer"}}}},"404":{"description":"Connection unavailable to this tenant, or the requested menu/order does not exist.","content":{"application/json":{"schema":{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},"example":{"detail":"order_not_found"}}}},"503":{"description":"Outcome unconfirmed. Retry after at least 5 seconds; preserve order ID and body.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","title":"Error","required":["error","retry_same_order_id"],"properties":{"error":{"type":"string"},"retry_same_order_id":{"type":"boolean"}}},{"type":"object","required":["error"],"properties":{"error":{"type":"string","const":"storage_unavailable"}}}]},"example":{"error":"retail_unavailable","retry_same_order_id":true}}},"headers":{"Retry-After":{"description":"Minimum delay in seconds.","schema":{"type":"string","example":"5"}}}},"429":{"description":"Rate limit exceeded. Wait Retry-After seconds and retry the identical request.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/json":{"example":{"error":"rate_limit_exceeded"}}}}},"tags":["Orders"],"description":"Returns the order's current status from the restaurant. Use it to reconcile webhook notifications or poll when webhooks are not configured. A 503 means the status couldn't be read, not that the order was rejected. Stop polling on completed, rejected or cancelled."}},"/v1/connections/{connection_id}/orders/{external_order_id}/refunds":{"post":{"summary":"Report an external refund outcome","operationId":"reportRefund","security":[{"WebsiteKey":[]}],"parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,100}$","title":"Connection Id"}},{"name":"external_order_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,100}$","title":"External Order Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefundReport"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderReceipt"}}}},"422":{"description":"Invalid input. Field paths and types are returned; input values are omitted.","content":{"application/json":{"schema":{"type":"object","title":"ValidationError","required":["error","fields"],"properties":{"error":{"type":"string"},"fields":{"type":"array","items":{"type":"object","required":["path","type"],"properties":{"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"integer"}]}},"type":{"type":"string"}}}}}},"example":{"error":"invalid_request","fields":[{"path":["body","total"],"type":"int_type"}]}}}},"401":{"description":"Missing, invalid or wrong-role key.","content":{"application/json":{"schema":{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},"example":{"detail":"invalid_credentials"}}},"headers":{"WWW-Authenticate":{"schema":{"type":"string","example":"Bearer"}}}},"404":{"description":"Connection unavailable to this tenant, or the requested menu/order does not exist.","content":{"application/json":{"schema":{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},"example":{"detail":"order_not_found"}}}},"409":{"description":"Conflict, such as an outdated menu revision or a sold-out item. The error code says what to change.","content":{"application/json":{"schema":{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string"}}},"example":{"error":"refund_report_not_allowed"}}}},"503":{"description":"Outcome unconfirmed. Retry after at least 5 seconds; preserve order ID and body.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","title":"Error","required":["error","retry_same_order_id"],"properties":{"error":{"type":"string"},"retry_same_order_id":{"type":"boolean"}}},{"type":"object","required":["error"],"properties":{"error":{"type":"string","const":"storage_unavailable"}}}]},"example":{"error":"retail_unavailable","retry_same_order_id":true}}},"headers":{"Retry-After":{"description":"Minimum delay in seconds.","schema":{"type":"string","example":"5"}}}},"429":{"description":"Rate limit exceeded. Wait Retry-After seconds and retry the identical request.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/json":{"example":{"error":"rate_limit_exceeded"}}}}},"tags":["Orders"],"description":"Record a final succeeded or failed refund performed by your payment provider. This does not initiate or verify a refund and does not reverse a Retail receipt. Only paid_online orders are eligible. Save request_id and retry the identical body after an uncertain response. Each processor_reference is unique per order; at most 100 reports. Successful amounts cannot exceed the original order total."}},"/v1/connections/{connection_id}/orders/{external_order_id}/delivery":{"post":{"summary":"Report delivery progress","operationId":"updateDelivery","security":[{"WebsiteKey":[]}],"parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,100}$","title":"Connection Id"}},{"name":"external_order_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,100}$","title":"External Order Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderReceipt"}}}},"422":{"description":"Invalid input. Field paths and types are returned; input values are omitted.","content":{"application/json":{"schema":{"type":"object","title":"ValidationError","required":["error","fields"],"properties":{"error":{"type":"string"},"fields":{"type":"array","items":{"type":"object","required":["path","type"],"properties":{"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"integer"}]}},"type":{"type":"string"}}}}}},"example":{"error":"invalid_request","fields":[{"path":["body","total"],"type":"int_type"}]}}}},"401":{"description":"Missing, invalid or wrong-role key.","content":{"application/json":{"schema":{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},"example":{"detail":"invalid_credentials"}}},"headers":{"WWW-Authenticate":{"schema":{"type":"string","example":"Bearer"}}}},"404":{"description":"Connection unavailable to this tenant, or the requested menu/order does not exist.","content":{"application/json":{"schema":{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},"example":{"detail":"order_not_found"}}}},"409":{"description":"Conflict, such as an outdated menu revision or a sold-out item. The error code says what to change.","content":{"application/json":{"schema":{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string"}}},"example":{"error":"delivery_update_not_allowed"}}}},"503":{"description":"Outcome unconfirmed. Retry after at least 5 seconds; preserve order ID and body.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","title":"Error","required":["error","retry_same_order_id"],"properties":{"error":{"type":"string"},"retry_same_order_id":{"type":"boolean"}}},{"type":"object","required":["error"],"properties":{"error":{"type":"string","const":"storage_unavailable"}}}]},"example":{"error":"retail_unavailable","retry_same_order_id":true}}},"headers":{"Retry-After":{"description":"Minimum delay in seconds.","schema":{"type":"string","example":"5"}}}},"429":{"description":"Rate limit exceeded. Wait Retry-After seconds and retry the identical request.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/json":{"example":{"error":"rate_limit_exceeded"}}}}},"tags":["Orders"],"description":"Send a stable request_id for each update and retry its unchanged body after an uncertain result. Delivery orders only: assignment requires acceptance, pickup requires ready, and delivered requires picked_up. At most 100 distinct updates per order. Omitted contact details and estimates preserve previous values. This never records payment collection."}},"/v1/connections/{connection_id}/orders/{external_order_id}/cancel":{"post":{"summary":"Cancel an eligible order","operationId":"cancelOrder","security":[{"WebsiteKey":[]}],"parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,100}$","title":"Connection Id"}},{"name":"external_order_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,100}$","title":"External Order Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancellationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderReceipt"}}}},"422":{"description":"Invalid input. Field paths and types are returned; input values are omitted.","content":{"application/json":{"schema":{"type":"object","title":"ValidationError","required":["error","fields"],"properties":{"error":{"type":"string"},"fields":{"type":"array","items":{"type":"object","required":["path","type"],"properties":{"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"integer"}]}},"type":{"type":"string"}}}}}},"example":{"error":"invalid_request","fields":[{"path":["body","total"],"type":"int_type"}]}}}},"401":{"description":"Missing, invalid or wrong-role key.","content":{"application/json":{"schema":{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},"example":{"detail":"invalid_credentials"}}},"headers":{"WWW-Authenticate":{"schema":{"type":"string","example":"Bearer"}}}},"404":{"description":"Connection unavailable to this tenant, or the requested menu/order does not exist.","content":{"application/json":{"schema":{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},"example":{"detail":"order_not_found"}}}},"409":{"description":"Conflict, such as an outdated menu revision or a sold-out item. The error code says what to change.","content":{"application/json":{"schema":{"type":"object","title":"Error","required":["error"],"properties":{"error":{"type":"string"}}},"example":{"error":"cancellation_not_allowed"}}}},"503":{"description":"Outcome unconfirmed. Retry after at least 5 seconds; preserve order ID and body.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","title":"Error","required":["error","retry_same_order_id"],"properties":{"error":{"type":"string"},"retry_same_order_id":{"type":"boolean"}}},{"type":"object","required":["error"],"properties":{"error":{"type":"string","const":"storage_unavailable"}}}]},"example":{"error":"retail_unavailable","retry_same_order_id":true}}},"headers":{"Retry-After":{"description":"Minimum delay in seconds.","schema":{"type":"string","example":"5"}}}},"429":{"description":"Rate limit exceeded. Wait Retry-After seconds and retry the identical request.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/json":{"example":{"error":"rate_limit_exceeded"}}}}},"tags":["Orders"],"description":"Immediate orders can be cancelled before acceptance. Accepted scheduled orders can be cancelled strictly before their persisted preparation start, provided preparation has not begun. Later cancellation requires restaurant staff approval in Retail; completed orders cannot be cancelled. Retry the identical request_id and body after an uncertain response. A 409 cancellation_not_allowed means the order is outside the customer cancellation window or no longer eligible. Cancellation does not refund payment or reverse fiscal receipts; staff must reconcile existing receipts in Nexus ERP."}},"/v1/webhook":{"get":{"summary":"Read webhook configuration","operationId":"getWebhook","responses":{"200":{"description":"Current callback configuration; save any returned signing secret securely.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscription"}}}},"401":{"description":"Missing, invalid or wrong-role key.","content":{"application/json":{"schema":{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},"example":{"detail":"invalid_credentials"}}},"headers":{"WWW-Authenticate":{"schema":{"type":"string","example":"Bearer"}}}},"503":{"description":"Webhook signing is not enabled on this gateway. Contact Nexus; existing order routes remain available.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},{"type":"object","required":["error"],"properties":{"error":{"type":"string","const":"storage_unavailable"}}}]},"example":{"detail":"webhooks_not_configured"}}},"headers":{"Retry-After":{"description":"Minimum delay in seconds.","schema":{"type":"string","example":"5"}}}},"429":{"description":"Rate limit exceeded. Wait Retry-After seconds and retry the identical request.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/json":{"example":{"error":"rate_limit_exceeded"}}}}},"security":[{"WebsiteKey":[]}],"tags":["Webhooks"],"description":"Returns this tenant's callback configuration. The signing secret is never returned by GET. One callback serves every enabled POS connection."},"put":{"summary":"Configure a tenant webhook","operationId":"configureWebhook","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookConfiguration"},"example":{"url":"https://shop.example.com/nexus/events","enabled":true}}},"required":true},"responses":{"200":{"description":"Current callback configuration; save any returned signing secret securely.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscription"}}}},"422":{"description":"Invalid input. Field paths and types are returned; input values are omitted.","content":{"application/json":{"schema":{"type":"object","title":"ValidationError","required":["error","fields"],"properties":{"error":{"type":"string"},"fields":{"type":"array","items":{"type":"object","required":["path","type"],"properties":{"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"integer"}]}},"type":{"type":"string"}}}}}},"example":{"error":"invalid_request","fields":[{"path":["body","total"],"type":"int_type"}]}}}},"401":{"description":"Missing, invalid or wrong-role key.","content":{"application/json":{"schema":{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},"example":{"detail":"invalid_credentials"}}},"headers":{"WWW-Authenticate":{"schema":{"type":"string","example":"Bearer"}}}},"503":{"description":"Webhook signing is not enabled on this gateway. Contact Nexus; existing order routes remain available.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},{"type":"object","required":["error"],"properties":{"error":{"type":"string","const":"storage_unavailable"}}}]},"example":{"detail":"webhooks_not_configured"}}},"headers":{"Retry-After":{"description":"Minimum delay in seconds.","schema":{"type":"string","example":"5"}}}},"429":{"description":"Rate limit exceeded. Wait Retry-After seconds and retry the identical request.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/json":{"example":{"error":"rate_limit_exceeded"}}}}},"security":[{"WebsiteKey":[]}],"tags":["Webhooks"],"description":"Register one public HTTPS callback on port 443 using your website key. Set enabled to false to stop delivery. Creating or changing the URL returns a new signing_secret once and cancels queued events for the old configuration. An identical PUT preserves the secret and returns null for signing_secret; rotate it if the initial response was lost. New orders received while enabled are watched in the background; existing order history is not backfilled."}},"/v1/webhook/rotate-secret":{"post":{"summary":"Rotate the webhook signing secret","operationId":"rotateWebhookSecret","responses":{"200":{"description":"Current callback configuration; save any returned signing secret securely.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscription"}}}},"401":{"description":"Missing, invalid or wrong-role key.","content":{"application/json":{"schema":{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},"example":{"detail":"invalid_credentials"}}},"headers":{"WWW-Authenticate":{"schema":{"type":"string","example":"Bearer"}}}},"404":{"description":"See the error code and recovery guide.","content":{"application/json":{"schema":{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},"example":{"detail":"webhook_not_configured"}}}},"503":{"description":"Webhook signing is not enabled on this gateway. Contact Nexus; existing order routes remain available.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},{"type":"object","required":["error"],"properties":{"error":{"type":"string","const":"storage_unavailable"}}}]},"example":{"detail":"webhooks_not_configured"}}},"headers":{"Retry-After":{"description":"Minimum delay in seconds.","schema":{"type":"string","example":"5"}}}},"429":{"description":"Rate limit exceeded. Wait Retry-After seconds and retry the identical request.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/json":{"example":{"error":"rate_limit_exceeded"}}}}},"security":[{"WebsiteKey":[]}],"tags":["Webhooks"],"description":"Returns a new signing secret for the current callback. Queued events signed for the previous configuration are cancelled. An in-flight HTTP request can still arrive. API key rotation is separate and does not change this secret."}},"/v1/webhook/deliveries":{"get":{"summary":"Inspect recent webhook deliveries","operationId":"listWebhookDeliveries","responses":{"200":{"description":"Latest 100 delivery records for this tenant.","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/WebhookDelivery"},"type":"array","title":"Response Webhook Deliveries V1 Webhook Deliveries Get"}}}},"401":{"description":"Missing, invalid or wrong-role key.","content":{"application/json":{"schema":{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},"example":{"detail":"invalid_credentials"}}},"headers":{"WWW-Authenticate":{"schema":{"type":"string","example":"Bearer"}}}},"503":{"description":"Webhook signing is not enabled on this gateway. Contact Nexus; existing order routes remain available.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},{"type":"object","required":["error"],"properties":{"error":{"type":"string","const":"storage_unavailable"}}}]},"example":{"detail":"webhooks_not_configured"}}},"headers":{"Retry-After":{"description":"Minimum delay in seconds.","schema":{"type":"string","example":"5"}}}},"429":{"description":"Rate limit exceeded. Wait Retry-After seconds and retry the identical request.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/json":{"example":{"error":"rate_limit_exceeded"}}}}},"security":[{"WebsiteKey":[]}],"tags":["Webhooks"],"description":"Returns up to 100 recent deliveries for this tenant, newest first. Includes stable event IDs, order/connection IDs, attempt counts, delivery state and sanitized failure codes. Receiver response bodies and signing secrets are never exposed."}},"/v1/webhook/deliveries/{event_id}/retry":{"post":{"summary":"Retry an exhausted delivery","operationId":"retryWebhookDelivery","security":[{"WebsiteKey":[]}],"parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","pattern":"^evt_[a-f0-9]{48}$","title":"Event Id"}}],"responses":{"204":{"description":"The failed event was requeued with its original identity and body."},"422":{"description":"Invalid input. Field paths and types are returned; input values are omitted.","content":{"application/json":{"schema":{"type":"object","title":"ValidationError","required":["error","fields"],"properties":{"error":{"type":"string"},"fields":{"type":"array","items":{"type":"object","required":["path","type"],"properties":{"path":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"integer"}]}},"type":{"type":"string"}}}}}},"example":{"error":"invalid_request","fields":[{"path":["body","total"],"type":"int_type"}]}}}},"401":{"description":"Missing, invalid or wrong-role key.","content":{"application/json":{"schema":{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},"example":{"detail":"invalid_credentials"}}},"headers":{"WWW-Authenticate":{"schema":{"type":"string","example":"Bearer"}}}},"404":{"description":"See the error code and recovery guide.","content":{"application/json":{"schema":{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},"example":{"detail":"failed_delivery_not_found"}}}},"503":{"description":"Webhook signing is not enabled on this gateway. Contact Nexus; existing order routes remain available.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","title":"DetailError","required":["detail"],"properties":{"detail":{"type":"string"}}},{"type":"object","required":["error"],"properties":{"error":{"type":"string","const":"storage_unavailable"}}}]},"example":{"detail":"webhooks_not_configured"}}},"headers":{"Retry-After":{"description":"Minimum delay in seconds.","schema":{"type":"string","example":"5"}}}},"429":{"description":"Rate limit exceeded. Wait Retry-After seconds and retry the identical request.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/json":{"example":{"error":"rate_limit_exceeded"}}}}},"tags":["Webhooks"],"description":"Requeues a failed event with the same event ID and body, with a fresh delivery attempt window. Only this tenant's failed events for the current enabled callback can be retried. The original per-order sequence remains unchanged; receivers must ignore older sequences."}}},"components":{"schemas":{"Address":{"properties":{"city":{"type":"string","maxLength":100,"minLength":1,"title":"City","description":"Delivery city."},"street":{"type":"string","maxLength":200,"minLength":1,"title":"Street","description":"Street and number."},"details":{"type":"string","maxLength":500,"title":"Details","default":"","description":"Apartment, entrance or other directions."}},"additionalProperties":false,"type":"object","required":["city","street"],"title":"Address"},"CancellationRequest":{"properties":{"request_id":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","description":"Stable cancellation identity. Save and resend the same ID and reason after uncertain outcomes."},"reason":{"type":"string","enum":["customer_request","duplicate","ordered_by_mistake","other"],"title":"Reason","description":"Customer cancellation reason. This never initiates a refund."}},"additionalProperties":false,"type":"object","required":["request_id","reason"],"title":"CancellationRequest"},"Category":{"properties":{"name":{"type":"string","maxLength":256,"minLength":1,"title":"Name","description":"Section name to show customers."},"translations":{"patternProperties":{"^[a-z]{2}(-[A-Z]{2})?$":{"$ref":"#/components/schemas/Translation"}},"type":"object","maxProperties":20,"title":"Translations","description":"Locale-keyed names and descriptions. Fall back to name and description when a translation is absent."},"id":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Id","description":"Category ID referenced by products."}},"additionalProperties":false,"type":"object","required":["name","id"],"title":"Category"},"CheckoutDiscount":{"properties":{"code":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Code","description":"Website coupon identifier; eligibility is checked by the website backend."},"amount":{"type":"integer","maximum":100000000.0,"minimum":1.0,"title":"Amount","description":"Restaurant-funded discount in integer bani, after menu promotions. Cannot exceed the eligible product base prices."},"product_ids":{"anyOf":[{"items":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$"},"type":"array","maxItems":100,"minItems":1},{"type":"null"}],"title":"Product Ids","description":"Optional unique product IDs from this order. Omit for all products. Extras, deposits, packaging, delivery and tips are excluded."}},"additionalProperties":false,"type":"object","required":["code","amount"],"title":"CheckoutDiscount"},"ConnectionList":{"properties":{"connections":{"items":{"$ref":"#/components/schemas/ConnectionSummary"},"type":"array","title":"Connections","description":"Connections enabled for your website key. Empty until the restaurant enables one."}},"additionalProperties":false,"type":"object","required":["connections"],"title":"ConnectionList"},"ConnectionSummary":{"properties":{"id":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Id","description":"Connection ID to use in menu, order and status URLs."},"location_id":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Location Id","description":"The restaurant location's ID."},"location_name":{"type":"string","title":"Location Name","description":"Location name to show customers."},"pos_id":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Pos Id","description":"The receiving register's ID."},"pos_name":{"type":"string","title":"Pos Name","description":"Register name, useful for support."}},"additionalProperties":false,"type":"object","required":["id","location_id","location_name","pos_id","pos_name"],"title":"ConnectionSummary"},"Customer":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name","description":"Customer name for staff and the receipt."},"phone":{"type":"string","maxLength":40,"minLength":3,"title":"Phone","description":"Phone number staff can call about the order."}},"additionalProperties":false,"type":"object","required":["name","phone"],"title":"Customer"},"DatePeriod":{"properties":{"start":{"type":"string","title":"Start","description":"Inclusive local start time, HH:mm."},"end":{"type":"string","title":"End","description":"Exclusive end on the same date, HH:mm; 24:00 is allowed."}},"additionalProperties":false,"type":"object","required":["start","end"],"title":"DatePeriod"},"DeliveryStatus":{"properties":{"status":{"type":"string","enum":["assigned","arrived","picked_up","delivered"],"title":"Status","description":"Last committed delivery progress."},"estimated_pickup_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Estimated Pickup At","description":"Latest pickup estimate, or null."},"estimated_delivery_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Estimated Delivery At","description":"Latest delivery estimate, or null."},"picked_up_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Picked Up At","description":"Server timestamp when pickup was recorded."},"delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Delivered At","description":"Server timestamp when delivery was recorded."}},"additionalProperties":false,"type":"object","required":["status"],"title":"DeliveryStatus"},"DeliveryUpdate":{"properties":{"request_id":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","description":"Stable identity for this delivery update; retry unchanged."},"status":{"type":"string","enum":["assigned","arrived","picked_up","delivered"],"title":"Status","description":"assigned, arrived, picked_up or delivered; transitions cannot move backwards."},"courier_name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Courier Name","description":"Courier name for restaurant staff; excluded from public status and webhooks."},"courier_phone":{"anyOf":[{"type":"string","maxLength":40,"minLength":3},{"type":"null"}],"title":"Courier Phone","description":"Courier phone for restaurant staff; excluded from public status and webhooks."},"estimated_pickup_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Estimated Pickup At","description":"Estimated pickup timestamp with offset; null preserves the previous estimate."},"estimated_delivery_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Estimated Delivery At","description":"Estimated delivery timestamp with offset; null preserves the previous estimate."}},"additionalProperties":false,"type":"object","required":["request_id","status"],"title":"DeliveryUpdate"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"Menu":{"properties":{"revision":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Revision","description":"Version of the published menu. Send it as menu_revision. Availability and accepting_orders can change without a new revision."},"currency":{"type":"string","const":"RON","title":"Currency","default":"RON","description":"Always RON. Amounts are integer bani."},"accepting_orders":{"type":"boolean","title":"Accepting Orders","default":true,"description":"False while the restaurant is paused or closed. Keep showing the menu but disable checkout."},"opening_hours":{"anyOf":[{"$ref":"#/components/schemas/OpeningHours"},{"type":"null"}],"description":"Current restaurant hours and date exceptions in its local time zone. Null when no policy is configured."},"scheduling":{"$ref":"#/components/schemas/SchedulingPolicy","description":"Scheduled orders are always supported; default preparation duration controls kitchen timing."},"fulfillment":{"items":{"type":"string","enum":["delivery","pickup"]},"type":"array","maxItems":2,"minItems":1,"title":"Fulfillment","description":"Always includes pickup and delivery."},"delivery_fee":{"type":"integer","maximum":100000000.0,"minimum":0.0,"title":"Delivery Fee","default":0,"description":"Fixed fee in bani, charged once per delivery order and never for pickup."},"tips_enabled":{"type":"boolean","title":"Tips Enabled","default":false,"description":"Whether restaurant staff tips can be included. Requires the POS tip configuration; courier tips are not included."},"categories":{"items":{"$ref":"#/components/schemas/Category"},"type":"array","maxItems":200,"minItems":1,"title":"Categories","description":"Menu sections."},"products":{"items":{"$ref":"#/components/schemas/Product"},"type":"array","maxItems":5000,"minItems":1,"title":"Products","description":"Everything that can be ordered. Each product references a category."}},"additionalProperties":false,"type":"object","required":["revision","fulfillment","categories","products"],"title":"Menu"},"Modifier":{"properties":{"name":{"type":"string","maxLength":256,"minLength":1,"title":"Name","description":"Option name to show customers."},"translations":{"patternProperties":{"^[a-z]{2}(-[A-Z]{2})?$":{"$ref":"#/components/schemas/Translation"}},"type":"object","maxProperties":20,"title":"Translations","description":"Locale-keyed names and descriptions. Fall back to name and description when a translation is absent."},"id":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Id","description":"Send as items[].modifiers[].option_id."},"price":{"type":"integer","maximum":100000000.0,"minimum":0.0,"title":"Price","description":"Added price in bani for an extra. Always 0 for variant and bundle options."},"deposit":{"type":"integer","maximum":100000000.0,"minimum":0.0,"title":"Deposit","default":0,"description":"Deposit in bani added when selected, such as a bottle deposit on an included drink."},"available":{"type":"boolean","title":"Available","default":true,"description":"False when sold out. Don't let customers select it."}},"additionalProperties":false,"type":"object","required":["name","id","price"],"title":"Modifier"},"ModifierGroup":{"properties":{"name":{"type":"string","maxLength":256,"minLength":1,"title":"Name","description":"Group name to show customers."},"translations":{"patternProperties":{"^[a-z]{2}(-[A-Z]{2})?$":{"$ref":"#/components/schemas/Translation"}},"type":"object","maxProperties":20,"title":"Translations","description":"Locale-keyed names and descriptions. Fall back to name and description when a translation is absent."},"kind":{"type":"string","enum":["extra","variant","bundle"],"title":"Kind","default":"extra","description":"variant defines the product (for example size), bundle is an included item, extra is a paid addition."},"id":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Id","description":"Send as items[].modifiers[].group_id."},"minimum":{"type":"integer","maximum":99.0,"minimum":0.0,"title":"Minimum","default":0,"description":"Fewest different options the customer must choose."},"maximum":{"type":"integer","maximum":99.0,"minimum":1.0,"title":"Maximum","default":1,"description":"Most different options the customer may choose."},"options":{"items":{"$ref":"#/components/schemas/Modifier"},"type":"array","maxItems":100,"minItems":1,"title":"Options","description":"The options in this group."}},"additionalProperties":false,"type":"object","required":["name","id","options"],"title":"ModifierGroup"},"OpeningHours":{"properties":{"schedule_enabled":{"type":"boolean","title":"Schedule Enabled","default":false,"description":"Whether weekly hours restrict ordering. Date exceptions and manual pauses still apply."},"time_zone":{"type":"string","title":"Time Zone","default":"Europe/Bucharest","description":"IANA time zone used for restaurant and product hours."},"periods":{"items":{"$ref":"#/components/schemas/OpeningPeriod"},"type":"array","maxItems":28,"title":"Periods","description":"Weekly opening intervals; overnight intervals are allowed."},"special_dates":{"items":{"$ref":"#/components/schemas/SpecialDate"},"type":"array","maxItems":366,"title":"Special Dates","description":"Whole-day replacements for specific local dates. Empty periods means closed."}},"additionalProperties":false,"type":"object","title":"OpeningHours"},"OpeningPeriod":{"properties":{"day":{"type":"integer","maximum":7.0,"minimum":1.0,"title":"Day","description":"ISO weekday: Monday 1 through Sunday 7."},"start":{"type":"string","title":"Start","description":"Inclusive local start time, HH:mm."},"end":{"type":"string","title":"End","description":"Exclusive local end time, HH:mm; 24:00 is allowed. An earlier time ends the next day."}},"additionalProperties":false,"type":"object","required":["day","start","end"],"title":"OpeningPeriod"},"OrderLine":{"properties":{"product_id":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Product Id","description":"A product ID from the menu."},"quantity":{"type":"integer","maximum":99.0,"minimum":1.0,"title":"Quantity","description":"Number of units, 1 to 99."},"modifiers":{"items":{"$ref":"#/components/schemas/Selection"},"type":"array","maxItems":100,"title":"Modifiers","description":"Every option the customer chose for this line, including size and included items. Each pair at most once."},"notes":{"type":"string","maxLength":500,"title":"Notes","default":"","description":"Instructions for this line, such as 'no onions'."}},"additionalProperties":false,"type":"object","required":["product_id","quantity"],"title":"OrderLine"},"OrderReceipt":{"properties":{"external_order_id":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"External Order Id","description":"Your order ID."},"status":{"type":"string","enum":["pending_acceptance","accepted","preparing","ready","out_for_delivery","completed","rejected","cancelled"],"title":"Status","description":"The order's progress. On a repeated POST, the status from when the order was first received."},"total":{"type":"integer","maximum":100000000.0,"minimum":0.0,"title":"Total","description":"The order total in bani."},"currency":{"type":"string","const":"RON","title":"Currency","description":"Always RON."},"scheduled_for":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled For","description":"Original requested fulfillment timestamp, or null for immediate orders."},"estimated_ready_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Estimated Ready At","description":"Restaurant ready estimate after acceptance; may be later than the requested time."},"reason":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Reason","description":"Rejection or cancellation reason code, when available."},"delivery":{"anyOf":[{"$ref":"#/components/schemas/DeliveryStatus"},{"type":"null"}],"description":"Delivery progress and estimates without courier contact details; null until reported."},"refund":{"anyOf":[{"$ref":"#/components/schemas/RefundStatus"},{"type":"null"}],"description":"External refund reporting summary, or null before the first report."}},"additionalProperties":false,"type":"object","required":["external_order_id","status","total","currency"],"title":"OrderReceipt"},"OrderRequest":{"properties":{"external_order_id":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"External Order Id","description":"Your ID for this purchase. Save it before sending and reuse it unchanged on every retry; the gateway never creates two orders for one ID."},"menu_revision":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Menu Revision","description":"The revision of the menu used to price this cart."},"currency":{"type":"string","const":"RON","title":"Currency","default":"RON","description":"Always RON."},"fulfillment":{"type":"string","enum":["delivery","pickup"],"title":"Fulfillment","description":"pickup or delivery. Both modes are supported."},"scheduled_for":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled For","description":"Requested fulfillment timestamp with explicit offset. Null means immediate fulfillment."},"customer":{"$ref":"#/components/schemas/Customer","description":"Who placed the order."},"address":{"anyOf":[{"$ref":"#/components/schemas/Address"},{"type":"null"}],"description":"Required for delivery; omit or send null for pickup."},"payment":{"$ref":"#/components/schemas/Payment","description":"How the order is paid. Nexus doesn't charge the customer."},"items":{"items":{"$ref":"#/components/schemas/OrderLine"},"type":"array","maxItems":100,"minItems":1,"title":"Items","description":"The cart: 1 to 100 lines."},"total":{"type":"integer","maximum":100000000.0,"minimum":0.0,"title":"Total","description":"Your calculated total in bani, after published discounts and including deposits, packaging, delivery fee and tip. The gateway recalculates and rejects a mismatch."},"tip":{"type":"integer","maximum":100000000.0,"minimum":0.0,"title":"Tip","default":0,"description":"Optional restaurant staff tip in bani, default zero. Include it once in total. Requires menu.tips_enabled."},"checkout_discount":{"anyOf":[{"$ref":"#/components/schemas/CheckoutDiscount"},{"type":"null"}],"description":"Optional checkout coupon. One per order; allocation is frozen with the original request."},"notes":{"type":"string","maxLength":1000,"title":"Notes","default":"","description":"Instructions for the whole order. Use items[].notes for a single product."}},"additionalProperties":false,"type":"object","required":["external_order_id","menu_revision","fulfillment","customer","payment","items","total"],"title":"OrderRequest"},"Payment":{"properties":{"method":{"type":"string","enum":["paid_online","cash_on_fulfillment","card_on_fulfillment"],"title":"Method","description":"paid_online when your payment provider has already charged the customer; cash_on_fulfillment or card_on_fulfillment when the restaurant collects payment."},"reference":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Reference","description":"Your payment provider's transaction reference. Required for paid_online; omit for the other methods."}},"additionalProperties":false,"type":"object","required":["method"],"title":"Payment"},"Product":{"properties":{"name":{"type":"string","maxLength":256,"minLength":1,"title":"Name","description":"Product name to show customers. Render as text."},"translations":{"patternProperties":{"^[a-z]{2}(-[A-Z]{2})?$":{"$ref":"#/components/schemas/Translation"}},"type":"object","maxProperties":20,"title":"Translations","description":"Locale-keyed names and descriptions. Fall back to name and description when a translation is absent."},"id":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Id","description":"Send as items[].product_id."},"category_id":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Category Id","description":"The category this product belongs to."},"description":{"type":"string","maxLength":4000,"title":"Description","default":"","description":"Optional description to show customers. Render as text."},"image_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Image Url","description":"Optional absolute HTTP(S) image URL. The gateway does not fetch the image."},"schedule":{"anyOf":[{"items":{"$ref":"#/components/schemas/OpeningPeriod"},"type":"array","maxItems":28},{"type":"null"}],"title":"Schedule","description":"Weekly product hours in opening_hours.time_zone. Null is unrestricted; an empty list means unavailable all week."},"price":{"type":"integer","maximum":100000000.0,"minimum":0.0,"title":"Price","description":"Base price in bani. For a product with variants, the selected variant's price replaces it."},"discount":{"type":"integer","maximum":100000000.0,"minimum":0.0,"title":"Discount","default":0,"description":"Published discount in bani per unit, subtracted from price before deposits, packaging and extras. Defaults to zero. Never send a discount in an order."},"deposit":{"type":"integer","maximum":100000000.0,"minimum":0.0,"title":"Deposit","default":0,"description":"Deposit in bani per unit, such as a bottle deposit. A selected variant's deposit replaces it."},"packaging":{"type":"integer","maximum":100000000.0,"minimum":0.0,"title":"Packaging","default":0,"description":"Packaging charge in bani per unit, added on top of the price."},"packaging_product_id":{"anyOf":[{"type":"string","maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$"},{"type":"null"}],"title":"Packaging Product Id","description":"The packaging item the restaurant adds to the receipt. Don't add it to your order."},"available":{"type":"boolean","title":"Available","default":true,"description":"False when sold out or not sold at this location. Don't let customers select it."},"modifier_groups":{"items":{"$ref":"#/components/schemas/ModifierGroup"},"type":"array","maxItems":30,"title":"Modifier Groups","description":"Choices for this product: variant (such as size), bundle (an included item) or extra (a paid addition)."},"variants":{"items":{"$ref":"#/components/schemas/Variant"},"type":"array","maxItems":500,"title":"Variants","description":"Every valid combination of the product's variant choices, each with its own price. Match the customer's choices to one of them."}},"additionalProperties":false,"type":"object","required":["name","id","category_id","price"],"title":"Product"},"RefundReport":{"properties":{"request_id":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","description":"Stable identity for this final refund report; retry unchanged."},"processor_reference":{"type":"string","maxLength":200,"minLength":1,"title":"Processor Reference","description":"Unique processor reference per order; retained privately for reconciliation."},"outcome":{"type":"string","enum":["succeeded","failed"],"title":"Outcome","description":"Final outcome reported by your website: succeeded or failed. Not verified with a processor."},"amount":{"type":"integer","maximum":100000000.0,"minimum":1.0,"title":"Amount","description":"Positive refund amount in bani, excluding refunds already reported."}},"additionalProperties":false,"type":"object","required":["request_id","processor_reference","outcome","amount"],"title":"RefundReport"},"RefundStatus":{"properties":{"reported_refunded_amount":{"type":"integer","maximum":100000000.0,"minimum":0.0,"title":"Reported Refunded Amount","description":"Sum of successful refund amounts reported by your website; not processor verification."},"report_count":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Report Count","description":"Number of distinct final reports, including failed refunds."},"last_outcome":{"type":"string","enum":["succeeded","failed"],"title":"Last Outcome","description":"Last reported outcome: succeeded or failed."},"last_reported_at":{"type":"string","format":"date-time","title":"Last Reported At","description":"Server timestamp of the most recently committed report."}},"additionalProperties":false,"type":"object","required":["reported_refunded_amount","report_count","last_outcome","last_reported_at"],"title":"RefundStatus"},"SchedulingPolicy":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":true,"description":"Always true. Scheduled orders do not require opt-in."},"preparation_minutes":{"type":"integer","maximum":240.0,"minimum":1.0,"title":"Preparation Minutes","default":20,"description":"Default preparation duration; staff may add time at acceptance."}},"additionalProperties":false,"type":"object","title":"SchedulingPolicy"},"Selection":{"properties":{"group_id":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Group Id","description":"A modifier group ID from the product."},"option_id":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Option Id","description":"An option ID from that group."}},"additionalProperties":false,"type":"object","required":["group_id","option_id"],"title":"Selection"},"SpecialDate":{"properties":{"date":{"type":"string","format":"date","title":"Date","description":"Local calendar date, YYYY-MM-DD."},"periods":{"items":{"$ref":"#/components/schemas/DatePeriod"},"type":"array","maxItems":8,"title":"Periods","description":"Intervals replacing the whole date. Empty means closed, including previous-day spillover."}},"additionalProperties":false,"type":"object","required":["date"],"title":"SpecialDate"},"Translation":{"properties":{"name":{"type":"string","maxLength":256,"minLength":1,"title":"Name","description":"Localized name. Render as text."},"description":{"type":"string","maxLength":4000,"title":"Description","default":"","description":"Localized description. Empty when not provided. Render as text."}},"additionalProperties":false,"type":"object","required":["name"],"title":"Translation"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"Variant":{"properties":{"id":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Id","description":"Identifies the combination. Don't send it in orders; send the choices instead."},"selections":{"items":{"$ref":"#/components/schemas/Selection"},"type":"array","maxItems":100,"title":"Selections","description":"The variant choices that make up this combination."},"price":{"type":"integer","maximum":100000000.0,"minimum":0.0,"title":"Price","description":"Price in bani for this combination, replacing the product price."},"discount":{"type":"integer","maximum":100000000.0,"minimum":0.0,"title":"Discount","default":0,"description":"Published discount in bani per unit, subtracted from price before deposits, packaging and extras. Defaults to zero. Never send a discount in an order."},"deposit":{"type":"integer","maximum":100000000.0,"minimum":0.0,"title":"Deposit","default":0,"description":"Deposit in bani for this combination, replacing the product deposit."},"available":{"type":"boolean","title":"Available","default":true,"description":"False when this combination can't be ordered."}},"additionalProperties":false,"type":"object","required":["id","selections","price"],"title":"Variant"},"WebhookConfiguration":{"properties":{"url":{"type":"string","maxLength":2048,"title":"Url","description":"Public HTTPS callback URL on port 443. No query, fragment or credentials."},"enabled":{"type":"boolean","title":"Enabled","default":true,"description":"Enable order, availability, menu and connection notifications. False cancels queued deliveries."}},"additionalProperties":false,"type":"object","required":["url"],"title":"WebhookConfiguration"},"WebhookDelivery":{"properties":{"id":{"type":"string","title":"Id","description":"Stable event ID. Deduplicate deliveries using this value."},"connection_id":{"type":"string","title":"Connection Id","description":"POS connection identified by this event."},"external_order_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Order Id","description":"Your order ID, or null for all connection and menu events."},"state":{"type":"string","enum":["pending","delivered","failed","cancelled"],"title":"State","description":"pending, delivered, failed or cancelled. Only failed events can be manually retried."},"attempts":{"type":"integer","title":"Attempts","description":"Number of claimed delivery attempts in the current retry window."},"last_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Status","description":"Last receiver HTTP status, or null when no response was received."},"failure":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure","description":"Safe failure code, or null. Receiver response bodies are never exposed."}},"additionalProperties":false,"type":"object","required":["id","connection_id","external_order_id","state","attempts","last_status","failure"],"title":"WebhookDelivery"},"WebhookSubscription":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Registered callback URL, or null before configuration."},"enabled":{"type":"boolean","title":"Enabled","default":false,"description":"Whether webhook watching and delivery are enabled."},"signing_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signing Secret","description":"Returned only when creating, changing the URL or rotating the secret. Store it securely in your backend."}},"additionalProperties":false,"type":"object","title":"WebhookSubscription"},"AvailabilityEventData":{"additionalProperties":false,"properties":{"accepting_orders":{"title":"Accepting Orders","type":"boolean","description":"Whether checkout is available now; scheduled slots must be evaluated through GET menu."},"reason":{"enum":["accepting","paused","closed","menu_not_published"],"title":"Reason","type":"string","description":"accepting, paused, closed or menu_not_published."},"pause_until":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Pause Until","description":"UTC pause expiry, or null for no timed pause. Expiry still respects opening hours."}},"required":["accepting_orders","reason"],"title":"AvailabilityEventData","type":"object"},"ConnectionEventData":{"additionalProperties":false,"properties":{"enabled":{"title":"Enabled","type":"boolean","description":"Whether this POS connection is enabled. Refresh the connection list; disabled connections cannot receive orders."},"location_id":{"title":"Location Id","type":"string","description":"The restaurant location's ID."},"location_name":{"title":"Location Name","type":"string","description":"Location name to show customers."},"pos_id":{"title":"Pos Id","type":"string","description":"The receiving register's ID."},"pos_name":{"title":"Pos Name","type":"string","description":"Register name, useful for support."}},"required":["enabled","location_id","location_name","pos_id","pos_name"],"title":"ConnectionEventData","type":"object"},"DeliveryEventData":{"additionalProperties":false,"properties":{"external_order_id":{"maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"External Order Id","type":"string","description":"Your order ID."},"request_id":{"maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string","description":"Your stable report request ID."},"status":{"enum":["assigned","arrived","picked_up","delivered"],"title":"Status","type":"string","description":"Delivery state submitted in this report, not necessarily the latest state."},"estimated_pickup_at":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Estimated Pickup At","description":"Pickup estimate supplied in this report, or null."},"estimated_delivery_at":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Estimated Delivery At","description":"Delivery estimate supplied in this report, or null."}},"required":["external_order_id","request_id","status"],"title":"DeliveryEventData","type":"object"},"MenuEventData":{"additionalProperties":false,"properties":{"revision":{"title":"Revision","type":"string","description":"Published revision at observation time. Refresh the connection menu; availability can change without a new revision."}},"required":["revision"],"title":"MenuEventData","type":"object"},"RefundEventData":{"additionalProperties":false,"properties":{"external_order_id":{"maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"External Order Id","type":"string","description":"Your order ID."},"request_id":{"maxLength":100,"minLength":1,"pattern":"^[A-Za-z0-9_-]+$","title":"Request Id","type":"string","description":"Your stable report request ID."},"outcome":{"enum":["succeeded","failed"],"title":"Outcome","type":"string","description":"Final outcome reported by your website: succeeded or failed. Not verified with a processor."},"amount":{"maximum":100000000,"minimum":0,"title":"Amount","type":"integer","description":"Refund amount for this report, in bani."}},"required":["external_order_id","request_id","outcome","amount"],"title":"RefundEventData","type":"object"},"SettingsEventData":{"additionalProperties":false,"properties":{"settings_version":{"pattern":"^[a-f0-9]{64}$","title":"Settings Version","type":"string","description":"Opaque fingerprint of observed operating settings. Refresh the connection menu for current opening_hours and scheduling; this is not a menu revision."}},"required":["settings_version"],"title":"SettingsEventData","type":"object"},"WebhookEvent":{"additionalProperties":false,"properties":{"id":{"pattern":"^evt_[a-f0-9]{48}$","title":"Id","type":"string","description":"Stable event ID. Deduplicate deliveries using this value."},"type":{"enum":["order.status_changed","order.updated","order.delivery_updated","refund.reported","connection.availability_changed","menu.published","menu.availability_changed","connection.changed","connection.settings_changed"],"title":"Type","type":"string","description":"Order updates, delivery/refund reports, restaurant availability, menus or POS connection changes."},"sequence":{"minimum":1,"title":"Sequence","type":"integer","description":"Increasing per-order sequence; non-order events use a separate sequence for each connection and event type. Ignore older updates."},"observed_at":{"title":"Observed At","type":"string","description":"UTC observation time, not the time of the restaurant action."},"connection_id":{"title":"Connection Id","type":"string","description":"POS connection identified by this event."},"data":{"anyOf":[{"$ref":"#/components/schemas/OrderReceipt"},{"$ref":"#/components/schemas/RefundEventData"},{"$ref":"#/components/schemas/DeliveryEventData"},{"$ref":"#/components/schemas/AvailabilityEventData"},{"$ref":"#/components/schemas/MenuEventData"},{"$ref":"#/components/schemas/ConnectionEventData"},{"$ref":"#/components/schemas/SettingsEventData"}],"title":"Data","description":"Payload depends on type: OrderReceipt, DeliveryEventData, RefundEventData, AvailabilityEventData, MenuEventData, ConnectionEventData or SettingsEventData."}},"required":["id","type","sequence","observed_at","connection_id","data"],"title":"WebhookEvent","type":"object"}},"securitySchemes":{"WebsiteKey":{"type":"http","scheme":"bearer","description":"Server-side website key scoped to one tenant, shared by its enabled POS connections. Never ship to a browser."},"PublisherKey":{"type":"http","scheme":"bearer","description":"Separate operator credential for menu publication only."}}},"tags":[{"name":"Connections"},{"name":"Menu"},{"name":"Orders"},{"name":"Webhooks"},{"name":"Publishing"},{"name":"Operations"}],"webhooks":{"order.status_changed":{"post":{"summary":"order.status_changed","description":"Signed POST to the registered tenant callback; delivery can be repeated. Verify the raw body and deduplicate by event ID.","parameters":[{"name":"X-Nexus-Signature","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Nexus-Event-Id","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"example":{"id":"evt_0123456789abcdef0123456789abcdef0123456789abcdef","type":"order.status_changed","sequence":1,"observed_at":"2026-10-19T10:00:00Z","connection_id":"website-example-pos","data":{"external_order_id":"shop-1001","status":"accepted","total":3700,"currency":"RON"}}}}},"responses":{"2XX":{"description":"Event durably stored or already received."}}}},"order.updated":{"post":{"summary":"order.updated","description":"Signed POST to the registered tenant callback; delivery can be repeated. Verify the raw body and deduplicate by event ID.","parameters":[{"name":"X-Nexus-Signature","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Nexus-Event-Id","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"example":{"id":"evt_0123456789abcdef0123456789abcdef0123456789abcdef","type":"order.updated","sequence":1,"observed_at":"2026-10-19T10:00:00Z","connection_id":"website-example-pos","data":{"external_order_id":"shop-1001","status":"accepted","total":3700,"currency":"RON"}}}}},"responses":{"2XX":{"description":"Event durably stored or already received."}}}},"order.delivery_updated":{"post":{"summary":"order.delivery_updated","description":"Signed POST to the registered tenant callback; delivery can be repeated. Verify the raw body and deduplicate by event ID.","parameters":[{"name":"X-Nexus-Signature","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Nexus-Event-Id","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"example":{"id":"evt_0123456789abcdef0123456789abcdef0123456789abcdef","type":"order.delivery_updated","sequence":1,"observed_at":"2026-10-19T10:00:00Z","connection_id":"website-example-pos","data":{"external_order_id":"web-123","request_id":"delivery-1","status":"assigned","estimated_pickup_at":null,"estimated_delivery_at":null}}}}},"responses":{"2XX":{"description":"Event durably stored or already received."}}}},"refund.reported":{"post":{"summary":"refund.reported","description":"Signed POST to the registered tenant callback; delivery can be repeated. Verify the raw body and deduplicate by event ID.","parameters":[{"name":"X-Nexus-Signature","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Nexus-Event-Id","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"example":{"id":"evt_0123456789abcdef0123456789abcdef0123456789abcdef","type":"refund.reported","sequence":1,"observed_at":"2026-10-19T10:00:00Z","connection_id":"website-example-pos","data":{"external_order_id":"web-123","request_id":"refund-1","outcome":"succeeded","amount":1200}}}}},"responses":{"2XX":{"description":"Event durably stored or already received."}}}},"connection.availability_changed":{"post":{"summary":"connection.availability_changed","description":"Signed POST to the registered tenant callback; delivery can be repeated. Verify the raw body and deduplicate by event ID.","parameters":[{"name":"X-Nexus-Signature","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Nexus-Event-Id","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"example":{"id":"evt_0123456789abcdef0123456789abcdef0123456789abcdef","type":"connection.availability_changed","sequence":1,"observed_at":"2026-10-19T10:00:00Z","connection_id":"website-example-pos","data":{"accepting_orders":false,"reason":"paused","pause_until":"2026-12-25T12:30:00Z"}}}}},"responses":{"2XX":{"description":"Event durably stored or already received."}}}},"menu.published":{"post":{"summary":"menu.published","description":"Signed POST to the registered tenant callback; delivery can be repeated. Verify the raw body and deduplicate by event ID.","parameters":[{"name":"X-Nexus-Signature","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Nexus-Event-Id","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"example":{"id":"evt_0123456789abcdef0123456789abcdef0123456789abcdef","type":"menu.published","sequence":1,"observed_at":"2026-10-19T10:00:00Z","connection_id":"website-example-pos","data":{"revision":"menu-2026-12-25"}}}}},"responses":{"2XX":{"description":"Event durably stored or already received."}}}},"menu.availability_changed":{"post":{"summary":"menu.availability_changed","description":"Signed POST to the registered tenant callback; delivery can be repeated. Verify the raw body and deduplicate by event ID.","parameters":[{"name":"X-Nexus-Signature","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Nexus-Event-Id","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"example":{"id":"evt_0123456789abcdef0123456789abcdef0123456789abcdef","type":"menu.availability_changed","sequence":1,"observed_at":"2026-10-19T10:00:00Z","connection_id":"website-example-pos","data":{"revision":"menu-2026-12-25"}}}}},"responses":{"2XX":{"description":"Event durably stored or already received."}}}},"connection.changed":{"post":{"summary":"connection.changed","description":"Signed POST to the registered tenant callback; delivery can be repeated. Verify the raw body and deduplicate by event ID.","parameters":[{"name":"X-Nexus-Signature","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Nexus-Event-Id","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"example":{"id":"evt_0123456789abcdef0123456789abcdef0123456789abcdef","type":"connection.changed","sequence":1,"observed_at":"2026-10-19T10:00:00Z","connection_id":"website-example-pos","data":{"enabled":false,"location_id":"1","location_name":"Central","pos_id":"10","pos_name":"Register"}}}}},"responses":{"2XX":{"description":"Event durably stored or already received."}}}},"connection.settings_changed":{"post":{"summary":"connection.settings_changed","description":"Signed POST to the registered tenant callback; delivery can be repeated. Verify the raw body and deduplicate by event ID.","parameters":[{"name":"X-Nexus-Signature","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Nexus-Event-Id","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"example":{"id":"evt_0123456789abcdef0123456789abcdef0123456789abcdef","type":"connection.settings_changed","sequence":1,"observed_at":"2026-10-19T10:00:00Z","connection_id":"website-example-pos","data":{"settings_version":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}}}}},"responses":{"2XX":{"description":"Event durably stored or already received."}}}}}}