{
  "openapi": "3.1.0",
  "info": {
    "title": "EPOS Data API (REST)",
    "version": "1.0",
    "description": "REST contract that an external POS/EPOS system implements so Dojo products can\nfetch and update commerce entities (Orders, Tables, Areas, Parties, Reservations)\nand record payments. Use this when the EPOS exposes its own publicly reachable\nHTTP endpoints; for on-premise EPOSes that cannot accept inbound HTTP, use the\n[WebSocket variant](/epos-data-asyncapi/bundled.yaml) of the same contract.\n\nCore modules:\n- Tables\n- Areas\n- Orders\n- Parties\n- Reservations\n\nAPI modules can generally be\nimplemented independently, with a small number of interdependent fields affected\nby other modules (for example, if Parties are implemented & the information is\nknown, a `partyId` should be attached to an Order's `dineInDetails`).\n\nAll requests also contain special headers within the REST headers,\ncontaining details about the requestor that can be used for logging purposes or EPOS business logic\n(such as waiter id based access to entities).\n\nBefore any of these endpoints will be invoked by Dojo, register the capabilities you implement with `PUT /epos/integrations/rest`. See the EPOS Data API guide for the full registration flow."
  },
  "servers": [
    {
      "url": "https://your-epos.example.com",
      "description": "The EPOS Data REST API has no shared base URL: each EPOS provider hosts the\nendpoints on their own domain and registers them against that base via\n`PUT /epos/integrations/rest`. The placeholder `https://your-epos.example.com`\nis illustrative — replace with your own publicly reachable HTTPS URL."
    }
  ],
  "tags": [
    {
      "name": "Areas"
    },
    {
      "name": "Orders"
    },
    {
      "name": "Parties"
    },
    {
      "name": "Reservations"
    },
    {
      "name": "Tables"
    },
    {
      "name": "Events"
    }
  ],
  "paths": {
    "/v1/areas": {
      "get": {
        "tags": [
          "Areas"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Area"
                  }
                }
              }
            },
            "description": "Successfully returns all areas"
          },
          "4XX": {
            "description": "Client Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          },
          "5XX": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          }
        },
        "operationId": "v1-list-areas",
        "summary": "List areas",
        "description": "Retrieves all areas that are being served. Capability: `ListAreas`\n",
        "parameters": [
          {
            "$ref": "#/components/parameters/WaiterId"
          },
          {
            "$ref": "#/components/parameters/DojoRequestingProduct"
          },
          {
            "$ref": "#/components/parameters/DeviceId"
          },
          {
            "$ref": "#/components/parameters/DeviceType"
          }
        ]
      }
    },
    "/v1/orders": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateOrderRequest"
              }
            }
          },
          "required": true
        },
        "tags": [
          "Orders"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Order"
                }
              }
            },
            "description": "."
          },
          "4XX": {
            "description": "Client Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          },
          "5XX": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          }
        },
        "operationId": "v1-post-orders",
        "summary": "Create an order",
        "description": "Create an order on the EPOS. Capability: `CreateOrder`\n",
        "parameters": [
          {
            "$ref": "#/components/parameters/WaiterId"
          },
          {
            "$ref": "#/components/parameters/DojoRequestingProduct"
          },
          {
            "$ref": "#/components/parameters/DeviceId"
          },
          {
            "$ref": "#/components/parameters/DeviceType"
          }
        ]
      }
    },
    "/v1/orders/{orderId}": {
      "get": {
        "tags": [
          "Orders"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Order"
                }
              }
            },
            "description": "OK"
          },
          "4XX": {
            "description": "Client Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          },
          "5XX": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          }
        },
        "operationId": "v1-get-orders-orderId",
        "summary": "Get an order by id",
        "description": "Retrieve details of an order using the order ID. Capability: `GetOrderById`\n"
      },
      "delete": {
        "tags": [
          "Orders"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Order"
                }
              }
            },
            "description": "OK"
          },
          "4XX": {
            "description": "Client Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          },
          "5XX": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          }
        },
        "operationId": "v1-delete-orders-orderId",
        "summary": "Cancel an order by id",
        "description": "Cancels an order by ID. Capability: `CancelOrderById`\n"
      },
      "parameters": [
        {
          "name": "orderId",
          "description": "The ID of the order to retrieve.",
          "schema": {
            "type": "string"
          },
          "in": "path",
          "required": true
        },
        {
          "$ref": "#/components/parameters/WaiterId"
        },
        {
          "$ref": "#/components/parameters/DojoRequestingProduct"
        },
        {
          "$ref": "#/components/parameters/DeviceId"
        },
        {
          "$ref": "#/components/parameters/DeviceType"
        }
      ]
    },
    "/v1/orders/search": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SearchOrdersRequest"
              }
            }
          },
          "required": true
        },
        "tags": [
          "Orders"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagedOrdersResponse"
                }
              }
            },
            "description": "."
          },
          "4XX": {
            "description": "Client Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          },
          "5XX": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          }
        },
        "summary": "Search orders",
        "description": "Searches through the orders on the EPOS. Capability: `SearchOrders`\n",
        "parameters": [
          {
            "$ref": "#/components/parameters/WaiterId"
          },
          {
            "$ref": "#/components/parameters/DojoRequestingProduct"
          },
          {
            "$ref": "#/components/parameters/DeviceId"
          },
          {
            "$ref": "#/components/parameters/DeviceType"
          }
        ]
      }
    },
    "/v1/orders/{orderId}/lock": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateOrderLockRequest"
              }
            }
          },
          "required": true
        },
        "tags": [
          "Orders"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Order"
                }
              }
            },
            "description": "Successful response with the order in its current state."
          },
          "409": {
            "description": "Conflict, order currently cannot be locked",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError",
                  "example": {
                    "errorType": "Conflict",
                    "debugMessage": "The order is already locked by waiter Joe at till 123",
                    "traceId": "some-internal-trace-guid"
                  }
                }
              }
            }
          },
          "4XX": {
            "description": "Client Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          },
          "5XX": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          }
        },
        "operationId": "v1-post-order-lock",
        "summary": "Lock an EPOS Order",
        "description": "Request a Dojo write lock on an EPOS Order, returning the latest version of the Order once locked. Capability: CreateOrderLock\n",
        "parameters": [
          {
            "$ref": "#/components/parameters/WaiterId"
          },
          {
            "$ref": "#/components/parameters/DojoRequestingProduct"
          },
          {
            "$ref": "#/components/parameters/DeviceId"
          },
          {
            "$ref": "#/components/parameters/DeviceType"
          }
        ]
      },
      "parameters": [
        {
          "name": "orderId",
          "description": "The ID of the order to lock.",
          "schema": {
            "type": "string"
          },
          "in": "path",
          "required": true
        }
      ]
    },
    "/v1/orders/{orderId}/locks/{lockId}": {
      "delete": {
        "tags": [
          "Orders"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Order"
                }
              }
            },
            "description": "The order in the state after the lock has been released"
          },
          "4XX": {
            "description": "Client Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          },
          "5XX": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          }
        },
        "operationId": "v1-delete-order-lock",
        "summary": "Unlock an EPOS Order",
        "description": "Request to release a Dojo write lock on an EPOS Order, returning the latest version of the Order once unlocked. Capability: `DeleteOrderLock`\n",
        "parameters": [
          {
            "$ref": "#/components/parameters/WaiterId"
          },
          {
            "$ref": "#/components/parameters/DojoRequestingProduct"
          },
          {
            "$ref": "#/components/parameters/DeviceId"
          },
          {
            "$ref": "#/components/parameters/DeviceType"
          }
        ]
      },
      "put": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ExtendOrderLockRequest"
              }
            }
          },
          "required": true
        },
        "tags": [
          "Orders"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExtendOrderLockResponse"
                }
              }
            },
            "description": "."
          },
          "4XX": {
            "description": "Client Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          },
          "5XX": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          }
        },
        "operationId": "v1-put-extend-order-lock",
        "summary": "Extend an EPOS Order Lock",
        "description": "Request a Dojo write lock on an EPOS Order is extended, returning the latest version of the Order. Capability: `ExtendOrderLock`\n",
        "parameters": [
          {
            "$ref": "#/components/parameters/WaiterId"
          },
          {
            "$ref": "#/components/parameters/DojoRequestingProduct"
          },
          {
            "$ref": "#/components/parameters/DeviceId"
          },
          {
            "$ref": "#/components/parameters/DeviceType"
          }
        ]
      },
      "parameters": [
        {
          "name": "orderId",
          "description": "The ID of the order to unlock.",
          "schema": {
            "type": "string"
          },
          "in": "path",
          "required": true
        },
        {
          "name": "lockId",
          "description": "The unique ID of a lock generated by Dojo. Consuming this isn't strictly required as Dojo will create at most one lock per order, but it can be useful for tracking the lifecycle of any lock.",
          "schema": {
            "type": "string"
          },
          "in": "path",
          "required": true
        }
      ]
    },
    "/v1/orders/{orderId}/bill": {
      "get": {
        "tags": [
          "Orders"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrderBill"
                }
              }
            },
            "description": "Successful response with the bill for an order."
          },
          "4XX": {
            "description": "Client Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          },
          "5XX": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          }
        },
        "operationId": "v1-get-orders-bill",
        "summary": "Get a printable bill",
        "description": "Retrieve a printable version of the Order, specifying the Header and Footer sections as it should be printed on the terminal. Capability: `GetOrderBill`",
        "parameters": [
          {
            "$ref": "#/components/parameters/WaiterId"
          },
          {
            "$ref": "#/components/parameters/DojoRequestingProduct"
          },
          {
            "$ref": "#/components/parameters/DeviceId"
          },
          {
            "$ref": "#/components/parameters/DeviceType"
          }
        ]
      },
      "parameters": [
        {
          "name": "orderId",
          "description": "The ID of the order to get the bill for.",
          "schema": {
            "type": "string"
          },
          "in": "path",
          "required": true
        }
      ]
    },
    "/v1/orders/{orderId}/record-payment": {
      "post": {
        "tags": [
          "Orders"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaymentWithLockId"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": ".",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Order"
                }
              }
            }
          },
          "4XX": {
            "description": "Client Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          },
          "5XX": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          }
        },
        "summary": "Record Payment Request",
        "operationId": "v1-post-record-order-payment",
        "description": "Request to record a payment against this order. If the payment cannot be recorded, use the error messages and Dojo will reverse/release/refund the payment. Capability: `RecordOrderPayment`",
        "parameters": [
          {
            "$ref": "#/components/parameters/WaiterId"
          },
          {
            "$ref": "#/components/parameters/DojoRequestingProduct"
          },
          {
            "$ref": "#/components/parameters/DeviceId"
          },
          {
            "$ref": "#/components/parameters/DeviceType"
          }
        ]
      },
      "parameters": [
        {
          "name": "orderId",
          "description": "The ID of the order to record the payment against",
          "schema": {
            "type": "string"
          },
          "in": "path",
          "required": true
        }
      ]
    },
    "/v1/parties": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreatePartyRequest"
              }
            }
          }
        },
        "tags": [
          "Parties"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Party"
                }
              }
            },
            "description": "Party successfully created."
          },
          "4XX": {
            "description": "Client Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          },
          "5XX": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          }
        },
        "operationId": "v1-post-parties",
        "summary": "Create party",
        "description": "Create a new party in the POS domain. Capability: `CreateParty`\n",
        "parameters": [
          {
            "$ref": "#/components/parameters/WaiterId"
          },
          {
            "$ref": "#/components/parameters/DojoRequestingProduct"
          },
          {
            "$ref": "#/components/parameters/DeviceId"
          },
          {
            "$ref": "#/components/parameters/DeviceType"
          }
        ]
      }
    },
    "/v1/parties/{partyId}": {
      "get": {
        "tags": [
          "Parties"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Party"
                }
              }
            },
            "description": "Ok"
          },
          "4XX": {
            "description": "Client Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          },
          "5XX": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          }
        },
        "operationId": "v1-get-parties-partyId",
        "summary": "Get party",
        "description": "Retrieves a specific party. Capability: `GetPartyById`\n"
      },
      "put": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdatePartyRequest"
              }
            }
          }
        },
        "tags": [
          "Parties"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Party"
                }
              }
            },
            "description": "Party successfully updated."
          },
          "4XX": {
            "description": "Client Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          },
          "5XX": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          }
        },
        "operationId": "v1-put-parties-partyId",
        "summary": "Update party",
        "description": "Sets the party's details to those provided. Capability: `UpdatePartyById`\n"
      },
      "delete": {
        "tags": [
          "Parties"
        ],
        "responses": {
          "200": {
            "description": "."
          },
          "4XX": {
            "description": "Client Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          },
          "5XX": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          }
        },
        "operationId": "v1-delete-parties-partyId",
        "summary": "Delete party",
        "description": "Deletes a specific party. Capability: `DeletePartyById`\n"
      },
      "parameters": [
        {
          "name": "partyId",
          "description": "The ID of the party to retrieve.",
          "schema": {
            "type": "string"
          },
          "in": "path",
          "required": true
        },
        {
          "$ref": "#/components/parameters/WaiterId"
        },
        {
          "$ref": "#/components/parameters/DojoRequestingProduct"
        },
        {
          "$ref": "#/components/parameters/DeviceId"
        },
        {
          "$ref": "#/components/parameters/DeviceType"
        }
      ]
    },
    "/v1/reservations": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateReservationRequest"
              }
            }
          }
        },
        "tags": [
          "Reservations"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Reservation"
                }
              }
            },
            "description": "Reservation successfully created."
          },
          "4XX": {
            "description": "Client Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          },
          "5XX": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          }
        },
        "operationId": "v1-post-reservations",
        "summary": "Create reservation",
        "description": "Create a new reservation in the POS domain. Capability: `CreateReservation`\n",
        "parameters": [
          {
            "$ref": "#/components/parameters/WaiterId"
          },
          {
            "$ref": "#/components/parameters/DojoRequestingProduct"
          },
          {
            "$ref": "#/components/parameters/DeviceId"
          },
          {
            "$ref": "#/components/parameters/DeviceType"
          }
        ]
      }
    },
    "/v1/reservations/{reservationId}": {
      "get": {
        "tags": [
          "Reservations"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Reservation"
                }
              }
            },
            "description": "Ok"
          },
          "4XX": {
            "description": "Client Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          },
          "5XX": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          }
        },
        "operationId": "v1-get-reservations-reservationId",
        "summary": "Get reservation",
        "description": "Retrieves a specific reservation. Capability: `GetReservationById`\n"
      },
      "put": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateReservationRequest"
              }
            }
          }
        },
        "tags": [
          "Reservations"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Reservation"
                }
              }
            },
            "description": "Reservation successfully updated."
          },
          "4XX": {
            "description": "Client Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          },
          "5XX": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          }
        },
        "operationId": "v1-put-reservations-reservationId",
        "summary": "Update reservation",
        "description": "Sets the reservation's details to those provided. Capbility: `UpdateReservationById`\n"
      },
      "delete": {
        "tags": [
          "Reservations"
        ],
        "responses": {
          "200": {
            "description": "."
          },
          "4XX": {
            "description": "Client Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          },
          "5XX": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          }
        },
        "operationId": "v1-delete-reservations-reservationId",
        "summary": "Delete reservation",
        "description": "Deletes a specific reservation. Capability: `DeleteReservationById`\n"
      },
      "parameters": [
        {
          "name": "reservationId",
          "description": "The ID of the reservation to retrieve.",
          "schema": {
            "type": "string"
          },
          "in": "path",
          "required": true
        },
        {
          "$ref": "#/components/parameters/WaiterId"
        },
        {
          "$ref": "#/components/parameters/DojoRequestingProduct"
        },
        {
          "$ref": "#/components/parameters/DeviceId"
        },
        {
          "$ref": "#/components/parameters/DeviceType"
        }
      ]
    },
    "/v1/reservations/search": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SearchReservationsRequest"
              }
            }
          },
          "required": true
        },
        "tags": [
          "Reservations"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagedReservationsResponse"
                }
              }
            },
            "description": "Ok"
          },
          "4XX": {
            "description": "Client Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          },
          "5XX": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          }
        },
        "operationId": "v1-search-reservations",
        "summary": "Search reservations",
        "description": "Search through reservations on the EPOS. Capability: `SearchReservations`\n",
        "parameters": [
          {
            "$ref": "#/components/parameters/WaiterId"
          },
          {
            "$ref": "#/components/parameters/DojoRequestingProduct"
          },
          {
            "$ref": "#/components/parameters/DeviceId"
          },
          {
            "$ref": "#/components/parameters/DeviceType"
          }
        ]
      }
    },
    "/v1/parties/search": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SearchPartiesRequest"
              }
            }
          },
          "required": true
        },
        "tags": [
          "Parties"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagedPartiesResponse"
                }
              }
            },
            "description": "Ok"
          },
          "4XX": {
            "description": "Client Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          },
          "5XX": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          }
        },
        "operationId": "v1-search-parties",
        "summary": "Search parties",
        "description": "Searches through parties on the EPOS.\nBy default, this endpoint should exclude parties with `endTime` set, including them only when `completedOnly: true`.\nCapability: `SearchParties`\n",
        "parameters": [
          {
            "$ref": "#/components/parameters/WaiterId"
          },
          {
            "$ref": "#/components/parameters/DojoRequestingProduct"
          },
          {
            "$ref": "#/components/parameters/DeviceId"
          },
          {
            "$ref": "#/components/parameters/DeviceType"
          }
        ]
      }
    },
    "/v1/tables/search": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SearchTablesRequest"
              }
            }
          },
          "required": true
        },
        "tags": [
          "Tables"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PagedTablesResponse"
                  }
                }
              }
            },
            "description": "Ok"
          },
          "4XX": {
            "description": "Client Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          },
          "5XX": {
            "description": "Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EPOSError"
                }
              }
            }
          }
        },
        "operationId": "v1-search-tables",
        "summary": "Search tables",
        "description": "Search through tables on the EPOS. Capability: `SearchTables`\n",
        "parameters": [
          {
            "$ref": "#/components/parameters/WaiterId"
          },
          {
            "$ref": "#/components/parameters/DojoRequestingProduct"
          },
          {
            "$ref": "#/components/parameters/DeviceId"
          },
          {
            "$ref": "#/components/parameters/DeviceType"
          }
        ]
      }
    }
  },
  "components": {
    "parameters": {
      "WaiterId": {
        "in": "header",
        "name": "waiter-id",
        "required": false,
        "schema": {
          "type": "string"
        },
        "example": "42",
        "description": "The ID of the waiter making the request, if known"
      },
      "DojoRequestingProduct": {
        "name": "dojo-requesting-product",
        "in": "header",
        "required": false,
        "schema": {
          "type": "string"
        },
        "example": "Order&Pay",
        "description": "The dojo product making the request, if known."
      },
      "DeviceId": {
        "name": "device-id",
        "in": "header",
        "required": false,
        "schema": {
          "type": "string"
        },
        "example": "tm_sandbox_65c5fe8a104a1222b2d8b968",
        "description": "The ID of the device making the request, if known"
      },
      "DeviceType": {
        "in": "header",
        "name": "device-type",
        "required": false,
        "schema": {
          "type": "string"
        },
        "example": "Dojo Terminal",
        "description": "The device making the request, if known"
      }
    },
    "schemas": {
      "Area": {
        "description": "A representation of a physical area in a merchant's location.",
        "required": [
          "id",
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "description": "Unique ID of the area",
            "type": "string"
          },
          "name": {
            "description": "User friendly name of the area",
            "type": "string",
            "example": ""
          },
          "waiterIds": {
            "description": "",
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "example": {
          "id": "area_1234",
          "name": "downstairs"
        }
      },
      "EPOSErrorType": {
        "type": "string",
        "enum": [
          "NotFound",
          "UnexpectedError",
          "InvalidRequest",
          "Conflict"
        ]
      },
      "EPOSError": {
        "title": "EPOSError",
        "type": "object",
        "required": [
          "errorType"
        ],
        "properties": {
          "debugMessage": {
            "type": "string"
          },
          "traceId": {
            "type": "string"
          },
          "errorType": {
            "$ref": "#/components/schemas/EPOSErrorType"
          }
        }
      },
      "Money": {
        "title": "Money",
        "required": [
          "value",
          "currencyCode"
        ],
        "type": "object",
        "properties": {
          "value": {
            "format": "int64",
            "description": "The amount in the minor unit, for example '100' for 1.00 GBP.",
            "type": "integer"
          },
          "currencyCode": {
            "description": "Three-letter currency code in ISO 4217 alpha-3 format. Currently this accepts `GBP` and `EUR`.",
            "maxLength": 10,
            "minLength": 1,
            "type": "string"
          }
        },
        "example": {
          "value": 1000,
          "currencyCode": "GBP"
        },
        "x-stoplight": {
          "id": "c9op7zec1txu2"
        }
      },
      "Modifier": {
        "title": "Modifier",
        "required": [
          "amountPerModifier",
          "name",
          "plu",
          "quantity"
        ],
        "type": "object",
        "properties": {
          "name": {
            "description": "A human-readable name of the modifier.",
            "type": "string",
            "x-stoplight": {
              "id": "dbij8ceea0jui"
            }
          },
          "quantity": {
            "description": "How many times this modifier is applied to the item. Please note that this amount is per single item, so if a customer orders two burgers each with double extra cheese, the quantity should be 2, not 4.",
            "type": "integer",
            "x-stoplight": {
              "id": "0o2r5334l8vue"
            }
          },
          "amountPerModifier": {
            "$ref": "#/components/schemas/Money",
            "description": "The price of the single modifier."
          },
          "plu": {
            "description": "",
            "type": "string"
          }
        },
        "x-stoplight": {
          "id": "a8zdtsiz5l6a8"
        }
      },
      "OrderSubItem": {
        "required": [
          "name",
          "amountPerItem",
          "plu",
          "quantity"
        ],
        "type": "object",
        "properties": {
          "amountPerItem": {
            "description": "The base price of the single sub item, without its parent item, before any modifiers or discounts are applied.",
            "$ref": "#/components/schemas/Money"
          },
          "quantity": {
            "type": "integer"
          },
          "note": {
            "type": "string"
          },
          "name": {
            "description": "A human-readable name of the item.",
            "type": "string"
          },
          "plu": {
            "type": "string"
          },
          "modifiers": {
            "description": "Modifiers applied to the subitem",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Modifier"
            }
          }
        },
        "x-examples": {
          "Example 1": {
            "plu": "UGG-BB-PUR-06",
            "name": "test",
            "price": 0,
            "quantity": 1073741824,
            "note": "string",
            "modifiers": [],
            "subItems": []
          }
        }
      },
      "OrderItem": {
        "required": [
          "name",
          "amountPerItem",
          "plu",
          "quantity"
        ],
        "type": "object",
        "properties": {
          "amountPerItem": {
            "description": "The base price of the single item, before any modifiers, subitems or discounts are applied.",
            "$ref": "#/components/schemas/Money"
          },
          "quantity": {
            "type": "integer"
          },
          "note": {
            "type": "string"
          },
          "name": {
            "description": "A human-readable name of the item.",
            "type": "string"
          },
          "plu": {
            "type": "string"
          },
          "subItems": {
            "description": "Sub-items applied to the item",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OrderSubItem"
            }
          },
          "modifiers": {
            "description": "Modifiers applied to the item",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Modifier"
            }
          }
        },
        "x-examples": {
          "Example 1": {
            "plu": "UGG-BB-PUR-06",
            "name": "test",
            "price": 0,
            "quantity": 1073741824,
            "note": "string",
            "modifiers": [],
            "subItems": []
          }
        }
      },
      "Customer": {
        "title": "Customer",
        "type": "object",
        "properties": {
          "id": {
            "description": "The unique identifier of the customer.",
            "type": "string"
          },
          "emailAddress": {
            "description": "The customer's email address.",
            "maxLength": 254,
            "type": "string"
          },
          "phoneNumber": {
            "description": "The customer's phone number.",
            "maxLength": 50,
            "type": "string"
          },
          "name": {
            "description": "The customer's name.",
            "type": "string",
            "x-stoplight": {
              "id": "rvqovaxl33c9q"
            }
          }
        },
        "additionalProperties": false,
        "example": {
          "emailAddress": "support@dojo.com",
          "phoneNumber": 448000443550
        }
      },
      "Discount": {
        "description": "",
        "required": [
          "name",
          "amountTotal"
        ],
        "type": "object",
        "properties": {
          "name": {
            "description": "The name that was given to the discount.",
            "type": "string"
          },
          "affectedPlu": {
            "description": "Product plu for which the discount is applied to. Empty if discount is for the total amount",
            "type": "string"
          },
          "discountReference": {
            "description": "Discount reference that uniquely identifies the discount",
            "type": "string"
          },
          "code": {
            "description": "Discount code",
            "type": "string"
          },
          "amountTotal": {
            "$ref": "#/components/schemas/Money"
          },
          "amountPercentage": {
            "description": "Percentage covered by the discount, which is stored with precision 2 (e.g., 25.1% ➜ 2510)",
            "type": "integer"
          }
        },
        "example": {
          "isPercentage": true,
          "provider": "Order & Pay app",
          "name": "Spring Sale 25% off",
          "discountCode": "SPRING2023",
          "discountReference": "123456",
          "affectedPlu": "item_123",
          "value": 2500,
          "amount": 500
        },
        "x-examples": {
          "Example 1": {
            "type": "Percentage",
            "provider": "provider",
            "name": "Spring Sale",
            "channelDiscountCode": "SPRING2023",
            "referenceId": 123456,
            "value": 1000,
            "amount": 500
          }
        }
      },
      "TaxLine": {
        "title": "TaxLine",
        "description": "The tax line object.",
        "required": [
          "amountTotal"
        ],
        "type": "object",
        "properties": {
          "id": {
            "description": "Unique identifier for the object.",
            "maxLength": 60,
            "type": "string"
          },
          "name": {
            "description": "A name of the tax.",
            "maxLength": 100,
            "type": "string"
          },
          "affectedPlu": {
            "description": "Plu of a product, if it is product specific tax",
            "type": "string"
          },
          "amountPercentage": {
            "description": "Tax percentage, which is stored with precision 2 (e.g., 25.1% ➜ 2510)",
            "type": "integer"
          },
          "amountTotal": {
            "$ref": "#/components/schemas/Money"
          }
        },
        "additionalProperties": false
      },
      "Payment": {
        "description": "",
        "required": [
          "paidAmount",
          "paymentIntentId"
        ],
        "type": "object",
        "properties": {
          "paymentIntentId": {
            "description": "",
            "type": "string"
          },
          "paidAmount": {
            "$ref": "#/components/schemas/Money",
            "description": "Indicates the paid amount of this specific payment, excluding `tipsAmount` but includes eventual service charges."
          },
          "tipsAmount": {
            "$ref": "#/components/schemas/Money",
            "description": "The tip amount added to this specific payment. It is not included in `paidAmount`."
          }
        }
      },
      "DineInDetails": {
        "description": "Details for an order-in order",
        "type": "object",
        "properties": {
          "tableId": {
            "type": "string"
          },
          "waiterId": {
            "type": "string"
          },
          "partyId": {
            "description": "The ID of the party that made this order, if known.",
            "type": "string"
          },
          "reservationId": {
            "description": "If this order is a pre-order for a reservation, the ID of that reservation.",
            "type": "string"
          },
          "readyAt": {
            "format": "date-time",
            "description": "Specify timestamp in ISO8601 UTC standard when a pre-order should be ready. Only applicable for pre-orders.",
            "type": "string"
          }
        },
        "x-examples": {
          "Example 1": {
            "tableId": "test",
            "waiterId": "test"
          }
        }
      },
      "CollectionDetails": {
        "title": "CollectionDetails",
        "description": "",
        "type": "object",
        "properties": {
          "asap": {
            "description": "A boolean indicating whether order collection is as soon as possible",
            "type": "boolean"
          },
          "collectAt": {
            "format": "date-time",
            "description": "Order collection timestamp in ISO8601 UTC standard. Only applicable when asap is not set or false",
            "type": "string"
          }
        },
        "example": {
          "collectionTime": "2024-02-21T14:39:21.6050276Z",
          "asap": false
        }
      },
      "OrderType": {
        "description": "",
        "enum": [
          "DineIn",
          "Collection"
        ],
        "type": "string"
      },
      "OrderDetails": {
        "anyOf": [
          {
            "title": "Dine In",
            "required": [
              "dineIn"
            ]
          },
          {
            "title": "Collection",
            "required": [
              "collection"
            ]
          }
        ],
        "description": "Details about the order including the type and the details.",
        "required": [
          "orderType"
        ],
        "type": "object",
        "properties": {
          "dineIn": {
            "$ref": "#/components/schemas/DineInDetails"
          },
          "collection": {
            "$ref": "#/components/schemas/CollectionDetails"
          },
          "orderType": {
            "$ref": "#/components/schemas/OrderType"
          }
        }
      },
      "CreateOrderRequest": {
        "title": "CreateOrderRequest",
        "description": "",
        "required": [
          "details",
          "items",
          "totalAmount",
          "dojoOrderId",
          "payments"
        ],
        "type": "object",
        "properties": {
          "items": {
            "description": "The line items purchased by the customer.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OrderItem"
            }
          },
          "note": {
            "description": "Order note",
            "type": "string"
          },
          "customer": {
            "$ref": "#/components/schemas/Customer"
          },
          "discounts": {
            "description": "List of discounts applied to the order",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Discount"
            },
            "x-stoplight": {
              "id": "8ldf6i31rv859"
            }
          },
          "totalAmount": {
            "$ref": "#/components/schemas/Money",
            "description": "The total amount of the order, after discount and taxes. Includes `serviceChargeAmount` but not `tipsAmount`."
          },
          "taxLines": {
            "description": "Taxes applied to the order",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TaxLine"
            }
          },
          "serviceChargeAmount": {
            "$ref": "#/components/schemas/Money",
            "description": "The service charge amount applied to the order. This must already be included in `totalAmount`"
          },
          "reference": {
            "description": "Human readable order ID",
            "type": "string"
          },
          "dojoOrderId": {
            "description": "The Dojo API order ID",
            "type": "string"
          },
          "payments": {
            "description": "",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Payment"
            }
          },
          "details": {
            "$ref": "#/components/schemas/OrderDetails"
          },
          "displayName": {
            "description": "The display name of the order",
            "type": "string"
          }
        }
      },
      "OrderStatus": {
        "description": "",
        "enum": [
          "New",
          "Submitted",
          "Confirmed",
          "Accepted",
          "Preparing",
          "Prepared",
          "Ready",
          "Finalized",
          "Canceled",
          "Failed"
        ],
        "type": "string"
      },
      "Order": {
        "title": "Order",
        "required": [
          "id",
          "status",
          "details"
        ],
        "type": "object",
        "properties": {
          "id": {
            "description": "Order ID",
            "type": "string"
          },
          "items": {
            "description": "The line items purchased by the customer.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OrderItem"
            }
          },
          "note": {
            "type": "string",
            "x-stoplight": {
              "id": "zya8zg3nxml7g"
            }
          },
          "customer": {
            "$ref": "#/components/schemas/Customer"
          },
          "discounts": {
            "description": "List of discounts applied to the order",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Discount"
            },
            "x-stoplight": {
              "id": "8ldf6i31rv859"
            }
          },
          "taxLines": {
            "description": "Taxes applied to the order",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TaxLine"
            },
            "x-stoplight": {
              "id": "xsg3y0lftsyhl"
            }
          },
          "status": {
            "$ref": "#/components/schemas/OrderStatus",
            "description": "Order status",
            "default": "New",
            "x-stoplight": {
              "id": "hssxgnvst3s5l"
            }
          },
          "createdAt": {
            "format": "date-time",
            "description": "The creation date, in ISO 8601 UTC format.",
            "type": "string",
            "x-stoplight": {
              "id": "xu24ufyqm895l"
            }
          },
          "updatedAt": {
            "format": "date-time",
            "description": "The timestamp of the update date, in ISO 8601 UTC format.",
            "type": "string",
            "x-stoplight": {
              "id": "9hvb1r8h1wgdq"
            }
          },
          "totalAmount": {
            "$ref": "#/components/schemas/Money",
            "description": "The total amount of the order, after discount and taxes. Includes `serviceChargeAmount` but not `tipsAmount`."
          },
          "payments": {
            "description": "",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Payment"
            }
          },
          "payable": {
            "description": "Flag to indicate if the order is able to be paid for.",
            "type": "boolean"
          },
          "paidAmount": {
            "$ref": "#/components/schemas/Money",
            "description": "Indicates the paid amount of this specific payment, excluding `tipsAmount` but includes eventual service charges."
          },
          "serviceChargeAmount": {
            "$ref": "#/components/schemas/Money",
            "description": "The amount of service charge applied."
          },
          "reference": {
            "description": "Human readable order ID",
            "type": "string"
          },
          "tipsAmount": {
            "$ref": "#/components/schemas/Money",
            "description": "The sum of all the `tipsAmount` in the payments array. This must not be included in `totalAmount` or `paidAmount`"
          },
          "details": {
            "$ref": "#/components/schemas/OrderDetails"
          },
          "displayName": {
            "description": "The display name of the order",
            "type": "string"
          }
        },
        "x-stoplight": {
          "id": "2w4jh88mce9tz"
        },
        "example": {
          "id": "ord_12345678",
          "details": {
            "orderType": "DineIn",
            "dineIn": {
              "tableId": "Table 5",
              "waiterId": "Becky"
            }
          },
          "items": [
            {
              "quantity": 2,
              "name": "Pizza Pepperoni",
              "plu": "1234",
              "amountPerItem": {
                "value": 1235,
                "currencyCode": "GBP"
              }
            },
            {
              "quantity": 2,
              "name": "Lager",
              "plu": "1245",
              "amountPerItem": {
                "value": 510,
                "currencyCode": "GBP"
              }
            },
            {
              "quantity": 1,
              "name": "Water Still",
              "plu": "1",
              "amountPerItem": {
                "value": 50,
                "currencyCode": "GBP"
              }
            },
            {
              "quantity": 2,
              "name": "Coca Cola",
              "plu": "2",
              "amountPerItem": {
                "value": 249,
                "currencyCode": "GBP"
              }
            },
            {
              "quantity": 1,
              "name": "Burger",
              "plu": "234",
              "amountPerItem": {
                "value": 1090,
                "currencyCode": "GBP"
              },
              "modifiers": [
                {
                  "name": "No Lettuce",
                  "quantity": 1,
                  "amountPerItem": {
                    "value": 0,
                    "currencyCode": "GBP"
                  },
                  "plu": "74983"
                }
              ]
            },
            {
              "quantity": 1,
              "name": "Burger",
              "plu": "234",
              "amountPerItem": {
                "value": 1090,
                "currencyCode": "GBP"
              },
              "modifiers": [
                {
                  "name": "Extra Cheese",
                  "quantity": 1,
                  "amountPerItem": {
                    "value": 0,
                    "currencyCode": "GBP"
                  },
                  "plu": "10987"
                },
                {
                  "name": "Bacon",
                  "quantity": 1,
                  "amountPerItem": {
                    "value": 0,
                    "currencyCode": "GBP"
                  },
                  "plu": "872"
                }
              ]
            }
          ],
          "discounts": [
            {
              "name": "10% discount",
              "amountTotal": {
                "value": 621,
                "currencyCode": "GBP"
              },
              "amountPercentage": 1000
            }
          ],
          "serviceChargeAmount": {
            "value": 6295,
            "currencyCode": "GBP"
          },
          "taxLines": [
            {
              "id": "VAT",
              "name": "VAT",
              "amountPercentage": 20,
              "amountTotal": {
                "value": 6295,
                "currencyCode": "GBP"
              }
            }
          ],
          "status": "Created",
          "createdAt": "2022-03-15T20:00:00Z",
          "updatedAt": "2022-03-15T20:00:00Z",
          "totalAmount": {
            "value": 6295,
            "currencyCode": "GBP"
          },
          "payable": true,
          "paidAmount": {
            "value": 0,
            "currencyCode": "GBP"
          },
          "reference": "Table 5"
        }
      },
      "SearchDineInDetails": {
        "description": "Details for searching order-in orders",
        "type": "object",
        "properties": {
          "tableId": {
            "type": "string"
          },
          "waiterId": {
            "type": "string"
          },
          "partyId": {
            "description": "The ID of the party that made this order, if known.",
            "type": "string"
          },
          "reservationId": {
            "description": "If this order is a pre-order for a reservation, the ID of that reservation.",
            "type": "string"
          }
        },
        "x-examples": {
          "Example 1": {
            "tableId": "test",
            "waiterId": "test"
          }
        }
      },
      "Cursor": {
        "title": "Cursor",
        "description": "A cursor for use in pagination.",
        "type": "object",
        "properties": {
          "limit": {
            "description": "The maximum number of results to be returned in a single page.",
            "maximum": 100,
            "type": "integer",
            "x-stoplight": {
              "id": "l5tzcxdo5qbt1"
            }
          },
          "before": {
            "description": "A cursor for use in pagination for the previous page. before and after are mutually exclusive. Only one of these may be used.",
            "type": "string",
            "x-stoplight": {
              "id": "8vxj9sdmbby14"
            }
          },
          "after": {
            "description": "A cursor for use in pagination for the next page. before and after are mutually exclusive. Only one of these may be used.",
            "type": "string",
            "x-stoplight": {
              "id": "1jsibbqp1zdti"
            }
          }
        },
        "x-stoplight": {
          "id": "m8ixmhyvzw3oo"
        }
      },
      "SearchOrdersRequest": {
        "description": "",
        "type": "object",
        "properties": {
          "dineIn": {
            "$ref": "#/components/schemas/SearchDineInDetails"
          },
          "payableOnly": {
            "description": "Return only orders where payable=true",
            "type": "boolean"
          },
          "cursor": {
            "$ref": "#/components/schemas/Cursor"
          }
        }
      },
      "PagedOrdersResponse": {
        "title": "PagedOrder",
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Order"
            },
            "readOnly": false,
            "x-stoplight": {
              "id": "ou7je7f6bizdg"
            }
          },
          "before": {
            "type": "string",
            "x-stoplight": {
              "id": "jutkpidtbhr6q"
            }
          },
          "after": {
            "type": "string",
            "x-stoplight": {
              "id": "vwlxjfle0yxqt"
            }
          }
        },
        "x-stoplight": {
          "id": "bjkxvbo62zl42"
        }
      },
      "CreateOrderLockRequest": {
        "type": "object",
        "description": "Request a write lock on an Order, guaranteeing only Dojo can write changes to the order, until receiving the corresponding UnlockOrder request.",
        "additionalProperties": false,
        "title": "CreateOrderLockRequest",
        "required": [
          "lockId",
          "expiry"
        ],
        "properties": {
          "lockId": {
            "description": "The unique ID of a lock generated by Dojo. Consuming this isn't strictly required as Dojo will create at most one lock per order, but it can be useful for tracking the lifecycle of any lock.",
            "type": "string"
          },
          "expiry": {
            "description": "The lock expiry time. If this time has been reached and no UnlockOrder has been received the lock can be considered stale and released.\nThis may be extended by the ExtendOrderLockRequest if registered. It is optional to consume this expiry.\nDojo will always attempt to release or extend the lock before this expiry is reached, it exists to avoid stale locks if there is a full loss of communication between the EPOS and Dojo.\n",
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "ExtendOrderLockRequest": {
        "type": "object",
        "description": "Request an extension to the write lock on an Order.",
        "additionalProperties": false,
        "title": "ExtendOrderLockRequest",
        "required": [
          "expiry"
        ],
        "properties": {
          "expiry": {
            "description": "The lock expiry time. If this time has been reached and no UnlockOrder has been received the lock can be considered stale and released.\nThis may be extended by the ExtendOrderLockRequest if registered. It is optional to consume this expiry.\nDojo will always attempt to release or extend the lock before this expiry is reached, it exists to avoid stale locks if there is a full loss of communication between the EPOS and Dojo.\n",
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "ExtendOrderLockResponse": {
        "type": "object",
        "description": "Response for a write lock extension request",
        "additionalProperties": false,
        "title": "ExtendOrderLockResponse"
      },
      "Align": {
        "title": "Align",
        "type": "string",
        "enum": [
          "Center",
          "Left",
          "Right"
        ],
        "example": [
          "Center"
        ]
      },
      "BillImage": {
        "title": "BillImage",
        "required": [
          "svgImage"
        ],
        "type": "object",
        "properties": {
          "svgImage": {
            "title": "svgImage",
            "type": "string",
            "description": "SVG representation of an image"
          },
          "align": {
            "$ref": "#/components/schemas/Align"
          }
        },
        "description": "A bill line containing an image",
        "example": {
          "svgImage": "<svg viewBox='0 0 389 100' fill='none' xmlns='http://www.w3.org/2000/svg'><path d='M146.7 100C119.754 100 97.8318 77.5807 97.8318 50.0245C97.8318 22.4682 119.754 0.0489248 146.7 0.0489248C173.645 0.0489248 195.568 22.4682 195.568 50.0245C195.568 77.5807 173.645 100 146.7 100ZM146.616 17.6737C129.155 17.6737 114.946 32.204 114.946 50.0612C114.946 67.9183 129.155 82.4486 146.616 82.4486C164.078 82.4486 178.286 67.9183 178.286 50.0612C178.286 32.204 164.078 17.6737 146.616 17.6737ZM339.182 100C312.237 100 290.314 77.5807 290.314 50.0245C290.314 22.4682 312.237 0.0489248 339.182 0.0489248C366.128 0.0489248 388.05 22.4682 388.05 50.0245C388.05 77.5807 366.128 100 339.182 100ZM339.098 17.6737C321.637 17.6737 307.429 32.204 307.429 50.0612C307.429 67.9183 321.637 82.4486 339.098 82.4486C356.56 82.4486 370.768 67.9183 370.768 50.0612C370.768 32.204 356.56 17.6737 339.098 17.6737ZM17.5212 100C7.85764 100 0 91.9643 0 82.0817V17.9795C0 8.09687 7.85764 0.0489248 17.5212 0.0489248H38.2716C65.2172 0.0489248 87.1397 22.4682 87.1397 50.0245C87.1397 77.5807 65.2172 100 38.2716 100H17.5212ZM17.4136 17.6676C17.4136 17.6709 17.4108 17.6737 17.4075 17.6738C17.2907 17.677 17.1983 17.7736 17.1983 17.8938V82.2285C17.1983 82.3508 17.294 82.4486 17.4136 82.4486H37.853C55.3742 82.4486 69.7739 68.0651 69.9414 50.3792C70.0251 41.683 66.7601 33.476 60.7682 27.275C54.7643 21.0739 46.7751 17.6615 38.2716 17.6615H17.4197C17.4163 17.6615 17.4136 17.6642 17.4136 17.6676V17.6676ZM242.917 100C252.688 100 261.885 96.0983 268.822 89.0166C275.747 81.9349 279.562 72.5171 279.562 62.5245L279.61 2.66634C279.61 1.19863 278.438 0 277.003 0H264.995C263.56 0 262.388 1.19863 262.388 2.66634L262.34 62.5245C262.34 73.4711 253.621 82.3875 242.917 82.3875H242.618C232.081 82.2285 223.494 73.1654 223.494 62.2065V51.4432C223.494 49.9755 222.322 48.7769 220.887 48.7769H208.879C207.444 48.7769 206.272 49.9755 206.272 51.4432V62.1208C206.272 82.8889 222.621 99.8777 242.702 100H242.917Z' fill='#180F06'></path></svg>"
        }
      },
      "BillLogo": {
        "title": "BillLogo",
        "required": [
          "svgImage"
        ],
        "type": "object",
        "properties": {
          "svgImage": {
            "title": "svgImage",
            "type": "string",
            "description": "SVG representation of an image"
          }
        },
        "description": "A predefined bill field, containing a logo. This will appear at the top of the bill",
        "example": {
          "svgImage": "<svg viewBox='0 0 389 100' fill='none' xmlns='http://www.w3.org/2000/svg'><path d='M146.7 100C119.754 100 97.8318 77.5807 97.8318 50.0245C97.8318 22.4682 119.754 0.0489248 146.7 0.0489248C173.645 0.0489248 195.568 22.4682 195.568 50.0245C195.568 77.5807 173.645 100 146.7 100ZM146.616 17.6737C129.155 17.6737 114.946 32.204 114.946 50.0612C114.946 67.9183 129.155 82.4486 146.616 82.4486C164.078 82.4486 178.286 67.9183 178.286 50.0612C178.286 32.204 164.078 17.6737 146.616 17.6737ZM339.182 100C312.237 100 290.314 77.5807 290.314 50.0245C290.314 22.4682 312.237 0.0489248 339.182 0.0489248C366.128 0.0489248 388.05 22.4682 388.05 50.0245C388.05 77.5807 366.128 100 339.182 100ZM339.098 17.6737C321.637 17.6737 307.429 32.204 307.429 50.0612C307.429 67.9183 321.637 82.4486 339.098 82.4486C356.56 82.4486 370.768 67.9183 370.768 50.0612C370.768 32.204 356.56 17.6737 339.098 17.6737ZM17.5212 100C7.85764 100 0 91.9643 0 82.0817V17.9795C0 8.09687 7.85764 0.0489248 17.5212 0.0489248H38.2716C65.2172 0.0489248 87.1397 22.4682 87.1397 50.0245C87.1397 77.5807 65.2172 100 38.2716 100H17.5212ZM17.4136 17.6676C17.4136 17.6709 17.4108 17.6737 17.4075 17.6738C17.2907 17.677 17.1983 17.7736 17.1983 17.8938V82.2285C17.1983 82.3508 17.294 82.4486 17.4136 82.4486H37.853C55.3742 82.4486 69.7739 68.0651 69.9414 50.3792C70.0251 41.683 66.7601 33.476 60.7682 27.275C54.7643 21.0739 46.7751 17.6615 38.2716 17.6615H17.4197C17.4163 17.6615 17.4136 17.6642 17.4136 17.6676V17.6676ZM242.917 100C252.688 100 261.885 96.0983 268.822 89.0166C275.747 81.9349 279.562 72.5171 279.562 62.5245L279.61 2.66634C279.61 1.19863 278.438 0 277.003 0H264.995C263.56 0 262.388 1.19863 262.388 2.66634L262.34 62.5245C262.34 73.4711 253.621 82.3875 242.917 82.3875H242.618C232.081 82.2285 223.494 73.1654 223.494 62.2065V51.4432C223.494 49.9755 222.322 48.7769 220.887 48.7769H208.879C207.444 48.7769 206.272 49.9755 206.272 51.4432V62.1208C206.272 82.8889 222.621 99.8777 242.702 100H242.917Z' fill='#180F06'></path></svg>"
        }
      },
      "BillMerchantAddress": {
        "title": "BillMerchantAddress",
        "required": [
          "addressLines",
          "postcode"
        ],
        "type": "object",
        "properties": {
          "addressLines": {
            "title": "addressLines",
            "type": "array",
            "description": "Lines of address",
            "items": {
              "type": "string"
            }
          },
          "postcode": {
            "title": "postcode",
            "type": "string",
            "description": "ZIP or postal code."
          }
        },
        "description": "A predefined bill field, containing an address. This will be pre-formatted in the receipt",
        "example": {
          "addressLines": [
            "Brunel Building",
            "1 & 2 Canalside Walk"
          ],
          "postcode": "W2 1DG"
        }
      },
      "BillMerchantEmailAddress": {
        "title": "BillMerchantEmailAddress",
        "required": [
          "emailAddress"
        ],
        "type": "object",
        "properties": {
          "emailAddress": {
            "title": "emailAddress",
            "type": "string",
            "description": "The email address"
          }
        },
        "description": "A predefined bill field, containing the merchants contact email address. This will be pre-formatted in the bill",
        "example": {
          "emailAddress": "dojo@dojo.tech"
        }
      },
      "BillMerchantName": {
        "title": "BillMerchantName",
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "title": "name",
            "type": "string",
            "description": "A predefined bill field, containing the merchants name. This will be pre-formatted in the bill"
          }
        },
        "description": "A predefined bill field, containing the merchants name. This will be pre-formatted in the bill",
        "example": {
          "name": "Dojo"
        }
      },
      "BillMerchantPhoneNumber": {
        "title": "BillMerchantPhoneNumber",
        "required": [
          "phoneNumber"
        ],
        "type": "object",
        "properties": {
          "phoneNumber": {
            "title": "phoneNumber",
            "type": "string",
            "description": "The phone number"
          }
        },
        "description": "A predefined bill field, containing the merchants contact phone number. This will be pre-formatted in the bill",
        "example": {
          "phoneNumber": "01234 567890"
        }
      },
      "Size": {
        "title": "Size",
        "type": "string",
        "enum": [
          "Body",
          "Header1",
          "Header2"
        ]
      },
      "BillText": {
        "title": "BillText",
        "required": [
          "size",
          "value"
        ],
        "type": "object",
        "properties": {
          "value": {
            "title": "value",
            "type": "string",
            "description": "This is the text to be printed for this line. The maxLength of this string depends on the size options used"
          },
          "size": {
            "$ref": "#/components/schemas/Size"
          },
          "align": {
            "$ref": "#/components/schemas/Align"
          },
          "bold": {
            "title": "bold",
            "type": "boolean",
            "description": "Set this to true if you want the text to be bold. Compatible with all other flags"
          }
        },
        "description": "A bill line containing text, with optional conditional formatting",
        "example": {
          "value": "Welcome to Our Store!",
          "size": "Header1",
          "align": "Center",
          "bold": true
        }
      },
      "BillURL": {
        "title": "BillURL",
        "required": [
          "url"
        ],
        "type": "object",
        "properties": {
          "url": {
            "title": "url",
            "type": "string",
            "description": "The URL for the link"
          },
          "description": {
            "title": "description",
            "type": "string",
            "description": "Textual description of the URL, will be displayed if set"
          },
          "showQr": {
            "title": "showQR",
            "type": "boolean",
            "description": "If a QR code should be shown on the bill"
          },
          "showUrl": {
            "title": "showURL",
            "type": "boolean",
            "description": "If the URL should be shown on the bill"
          }
        },
        "description": "A bill line containing a URL. This can be printed as a QR code on bills, or a hyperlink with the text as the description, in digital format.",
        "example": {
          "url": "https://www.website.com",
          "showQR": true,
          "showURL": true,
          "description": "Check out our website!"
        }
      },
      "BillHorizontalLine": {
        "title": "HorizontalLineType",
        "type": "object",
        "properties": {
          "line": {
            "type": "string",
            "enum": [
              "Single",
              "Double"
            ]
          }
        },
        "description": "A bill line containing a horizontal line",
        "example": "Single"
      },
      "BillTaxNumber": {
        "title": "BillTaxNumber",
        "required": [
          "name",
          "number"
        ],
        "type": "object",
        "properties": {
          "name": {
            "title": "name",
            "type": "string",
            "description": "The tax name",
            "example": "VAT"
          },
          "number": {
            "title": "number",
            "type": "string",
            "description": "The tax number"
          }
        },
        "description": "A predefined bill field, containing the merchants tax number. This will be pre-formatted in the bill, and shown at the bottom",
        "example": {
          "name": "VAT",
          "number": "12345678"
        }
      },
      "BillLineType": {
        "title": "BillLineType",
        "type": "string",
        "enum": [
          "Image",
          "Logo",
          "MerchantAddress",
          "MerchantEmailAddress",
          "MerchantName",
          "MerchantPhoneNumber",
          "Text",
          "URL",
          "HorizontalLine",
          "TaxNumber"
        ]
      },
      "BillLine": {
        "title": "BillLine",
        "anyOf": [
          {
            "title": "Image",
            "required": [
              "image"
            ]
          },
          {
            "title": "Logo",
            "required": [
              "logo"
            ]
          },
          {
            "title": "Merchant Address",
            "required": [
              "merchantAddress"
            ]
          },
          {
            "title": "Merchant Email Address",
            "required": [
              "merchantEmailAddress"
            ]
          },
          {
            "title": "Merchant Name",
            "required": [
              "merchantName"
            ]
          },
          {
            "title": "Merchant Phone Number",
            "required": [
              "merchantPhoneNumber"
            ]
          },
          {
            "title": "Text",
            "required": [
              "text"
            ]
          },
          {
            "title": "URL/QR",
            "required": [
              "url"
            ]
          },
          {
            "title": "Horizontal Line",
            "required": [
              "horizontalLine"
            ]
          },
          {
            "title": "Tax Number",
            "required": [
              "taxNumber"
            ]
          }
        ],
        "required": [
          "lineType"
        ],
        "type": "object",
        "properties": {
          "image": {
            "$ref": "#/components/schemas/BillImage"
          },
          "logo": {
            "$ref": "#/components/schemas/BillLogo"
          },
          "merchantAddress": {
            "$ref": "#/components/schemas/BillMerchantAddress"
          },
          "merchantEmailAddress": {
            "$ref": "#/components/schemas/BillMerchantEmailAddress"
          },
          "merchantName": {
            "$ref": "#/components/schemas/BillMerchantName"
          },
          "merchantPhoneNumber": {
            "$ref": "#/components/schemas/BillMerchantPhoneNumber"
          },
          "text": {
            "$ref": "#/components/schemas/BillText"
          },
          "url": {
            "$ref": "#/components/schemas/BillURL"
          },
          "horizontalLine": {
            "$ref": "#/components/schemas/BillHorizontalLine"
          },
          "taxNumber": {
            "$ref": "#/components/schemas/BillTaxNumber"
          },
          "lineType": {
            "$ref": "#/components/schemas/BillLineType"
          }
        }
      },
      "BillSection": {
        "title": "BillSection",
        "type": "object",
        "required": [
          "lines"
        ],
        "properties": {
          "lines": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BillLine"
            }
          }
        },
        "description": "An object representing either a header or footer on a BillSection"
      },
      "OrderBill": {
        "title": "OrderBill",
        "required": [
          "header",
          "order",
          "footer"
        ],
        "type": "object",
        "properties": {
          "header": {
            "description": "Header",
            "type": "object",
            "$ref": "#/components/schemas/BillSection"
          },
          "order": {
            "description": "Order",
            "type": "object",
            "$ref": "#/components/schemas/Order"
          },
          "footer": {
            "description": "Footer",
            "type": "object",
            "$ref": "#/components/schemas/BillSection"
          }
        },
        "example": {
          "header": {
            "lines": [
              {
                "logo": {
                  "svgImage": "<svg viewBox='0 0 389 100' fill='none' xmlns='http://www.w3.org/2000/svg'><path d='M146.7 100C119.754 100 97.8318 77.5807 97.8318 50.0245C97.8318 22.4682 119.754 0.0489248 146.7 0.0489248C173.645 0.0489248 195.568 22.4682 195.568 50.0245C195.568 77.5807 173.645 100 146.7 100ZM146.616 17.6737C129.155 17.6737 114.946 32.204 114.946 50.0612C114.946 67.9183 129.155 82.4486 146.616 82.4486C164.078 82.4486 178.286 67.9183 178.286 50.0612C178.286 32.204 164.078 17.6737 146.616 17.6737ZM339.182 100C312.237 100 290.314 77.5807 290.314 50.0245C290.314 22.4682 312.237 0.0489248 339.182 0.0489248C366.128 0.0489248 388.05 22.4682 388.05 50.0245C388.05 77.5807 366.128 100 339.182 100ZM339.098 17.6737C321.637 17.6737 307.429 32.204 307.429 50.0612C307.429 67.9183 321.637 82.4486 339.098 82.4486C356.56 82.4486 370.768 67.9183 370.768 50.0612C370.768 32.204 356.56 17.6737 339.098 17.6737ZM17.5212 100C7.85764 100 0 91.9643 0 82.0817V17.9795C0 8.09687 7.85764 0.0489248 17.5212 0.0489248H38.2716C65.2172 0.0489248 87.1397 22.4682 87.1397 50.0245C87.1397 77.5807 65.2172 100 38.2716 100H17.5212ZM17.4136 17.6676C17.4136 17.6709 17.4108 17.6737 17.4075 17.6738C17.2907 17.677 17.1983 17.7736 17.1983 17.8938V82.2285C17.1983 82.3508 17.294 82.4486 17.4136 82.4486H37.853C55.3742 82.4486 69.7739 68.0651 69.9414 50.3792C70.0251 41.683 66.7601 33.476 60.7682 27.275C54.7643 21.0739 46.7751 17.6615 38.2716 17.6615H17.4197C17.4163 17.6615 17.4136 17.6642 17.4136 17.6676V17.6676ZM242.917 100C252.688 100 261.885 96.0983 268.822 89.0166C275.747 81.9349 279.562 72.5171 279.562 62.5245L279.61 2.66634C279.61 1.19863 278.438 0 277.003 0H264.995C263.56 0 262.388 1.19863 262.388 2.66634L262.34 62.5245C262.34 73.4711 253.621 82.3875 242.917 82.3875H242.618C232.081 82.2285 223.494 73.1654 223.494 62.2065V51.4432C223.494 49.9755 222.322 48.7769 220.887 48.7769H208.879C207.444 48.7769 206.272 49.9755 206.272 51.4432V62.1208C206.272 82.8889 222.621 99.8777 242.702 100H242.917Z' fill='#180F06'></path></svg>\n"
                },
                "lineType": "Logo"
              },
              {
                "merchantName": {
                  "name": "Dojo"
                },
                "lineType": "MerchantName"
              },
              {
                "merchantAddress": {
                  "addressLines": [
                    "Brunel Building",
                    "1 & 2 Canalside Walk"
                  ],
                  "postcode": "London W2 1DG"
                },
                "lineType": "MerchantAddress"
              },
              {
                "merchantEmailAddress": {
                  "emailAddress": "dojo@dojo.tech"
                },
                "lineType": "MerchantEmailAddress"
              },
              {
                "text": {
                  "value": "Welcome to Our Store!",
                  "size": "Header1",
                  "align": "Center",
                  "emphasisBold": true
                },
                "lineType": "Text"
              },
              {
                "image": {
                  "svgImage": "<svg viewBox='0 0 389 100' fill='none' xmlns='http://www.w3.org/2000/svg'><path d='M146.7 100C119.754 100 97.8318 77.5807 97.8318 50.0245C97.8318 22.4682 119.754 0.0489248 146.7 0.0489248C173.645 0.0489248 195.568 22.4682 195.568 50.0245C195.568 77.5807 173.645 100 146.7 100ZM146.616 17.6737C129.155 17.6737 114.946 32.204 114.946 50.0612C114.946 67.9183 129.155 82.4486 146.616 82.4486C164.078 82.4486 178.286 67.9183 178.286 50.0612C178.286 32.204 164.078 17.6737 146.616 17.6737ZM339.182 100C312.237 100 290.314 77.5807 290.314 50.0245C290.314 22.4682 312.237 0.0489248 339.182 0.0489248C366.128 0.0489248 388.05 22.4682 388.05 50.0245C388.05 77.5807 366.128 100 339.182 100ZM339.098 17.6737C321.637 17.6737 307.429 32.204 307.429 50.0612C307.429 67.9183 321.637 82.4486 339.098 82.4486C356.56 82.4486 370.768 67.9183 370.768 50.0612C370.768 32.204 356.56 17.6737 339.098 17.6737ZM17.5212 100C7.85764 100 0 91.9643 0 82.0817V17.9795C0 8.09687 7.85764 0.0489248 17.5212 0.0489248H38.2716C65.2172 0.0489248 87.1397 22.4682 87.1397 50.0245C87.1397 77.5807 65.2172 100 38.2716 100H17.5212ZM17.4136 17.6676C17.4136 17.6709 17.4108 17.6737 17.4075 17.6738C17.2907 17.677 17.1983 17.7736 17.1983 17.8938V82.2285C17.1983 82.3508 17.294 82.4486 17.4136 82.4486H37.853C55.3742 82.4486 69.7739 68.0651 69.9414 50.3792C70.0251 41.683 66.7601 33.476 60.7682 27.275C54.7643 21.0739 46.7751 17.6615 38.2716 17.6615H17.4197C17.4163 17.6615 17.4136 17.6642 17.4136 17.6676V17.6676ZM242.917 100C252.688 100 261.885 96.0983 268.822 89.0166C275.747 81.9349 279.562 72.5171 279.562 62.5245L279.61 2.66634C279.61 1.19863 278.438 0 277.003 0H264.995C263.56 0 262.388 1.19863 262.388 2.66634L262.34 62.5245C262.34 73.4711 253.621 82.3875 242.917 82.3875H242.618C232.081 82.2285 223.494 73.1654 223.494 62.2065V51.4432C223.494 49.9755 222.322 48.7769 220.887 48.7769H208.879C207.444 48.7769 206.272 49.9755 206.272 51.4432V62.1208C206.272 82.8889 222.621 99.8777 242.702 100H242.917Z' fill='#180F06'></path></svg>",
                  "align": "Left"
                },
                "lineType": "Image"
              },
              {
                "horizontalLine": {
                  "line": "Single"
                },
                "lineType": "HorizontalLine"
              },
              {
                "text": {
                  "value": "Table 5",
                  "size": "Header2",
                  "align": "Left"
                },
                "lineType": "Text"
              },
              {
                "text": {
                  "value": "Becky       15/03/2022 20:08",
                  "size": "Body",
                  "align": "Center"
                },
                "lineType": "Text"
              },
              {
                "text": {
                  "value": "Transaction:6328",
                  "size": "Body",
                  "align": "Right"
                },
                "lineType": "Text"
              }
            ]
          },
          "order": {
            "id": "ord_12345678",
            "details": {
              "orderType": "DineIn",
              "dineIn": {
                "tableId": "Table 5",
                "waiterId": "Becky"
              }
            },
            "items": [
              {
                "quantity": 2,
                "name": "Pizza Pepperoni",
                "plu": "1234",
                "amountPerItem": {
                  "value": 1235,
                  "currencyCode": "GBP"
                }
              },
              {
                "quantity": 2,
                "name": "Lager",
                "plu": "1245",
                "amountPerItem": {
                  "value": 510,
                  "currencyCode": "GBP"
                }
              },
              {
                "quantity": 1,
                "name": "Water Still",
                "plu": "1",
                "amountPerItem": {
                  "value": 50,
                  "currencyCode": "GBP"
                }
              },
              {
                "quantity": 2,
                "name": "Coca Cola",
                "plu": "2",
                "amountPerItem": {
                  "value": 249,
                  "currencyCode": "GBP"
                }
              },
              {
                "quantity": 1,
                "name": "Burger",
                "plu": "234",
                "amountPerItem": {
                  "value": 1090,
                  "currencyCode": "GBP"
                },
                "modifiers": [
                  {
                    "name": "No Lettuce",
                    "quantity": 1,
                    "amountPerItem": {
                      "value": 0,
                      "currencyCode": "GBP"
                    },
                    "plu": "74983"
                  }
                ]
              },
              {
                "quantity": 1,
                "name": "Burger",
                "plu": "234",
                "amountPerItem": {
                  "value": 1090,
                  "currencyCode": "GBP"
                },
                "modifiers": [
                  {
                    "name": "Extra Cheese",
                    "quantity": 1,
                    "amountPerItem": {
                      "value": 0,
                      "currencyCode": "GBP"
                    },
                    "plu": "10987"
                  },
                  {
                    "name": "Bacon",
                    "quantity": 1,
                    "amountPerItem": {
                      "value": 0,
                      "currencyCode": "GBP"
                    },
                    "plu": "872"
                  }
                ]
              }
            ],
            "discounts": [
              {
                "name": "10% discount",
                "amountTotal": {
                  "value": 621,
                  "currencyCode": "GBP"
                },
                "amountPercentage": 1000
              }
            ],
            "serviceChargeAmount": {
              "value": 6295,
              "currencyCode": "GBP"
            },
            "taxLines": [
              {
                "id": "VAT",
                "name": "VAT",
                "amountPercentage": 20,
                "amountTotal": {
                  "value": 6295,
                  "currencyCode": "GBP"
                }
              }
            ],
            "status": "Finalized",
            "createdAt": "2022-03-15T20:00:00Z",
            "updatedAt": "2022-03-15T20:05:00Z",
            "totalAmount": {
              "value": 6295,
              "currencyCode": "GBP"
            },
            "payable": true,
            "paidAmount": {
              "value": 0,
              "currencyCode": "GBP"
            },
            "reference": "Table 5"
          },
          "footer": {
            "lines": [
              {
                "text": {
                  "value": "Thank you",
                  "size": "Header1",
                  "align": "Center"
                },
                "lineType": "Text"
              },
              {
                "taxNumber": {
                  "name": "VAT",
                  "number": "342 6287 32"
                },
                "lineType": "TaxNumber"
              },
              {
                "url": {
                  "url": "https://www.website.com",
                  "showQR": true,
                  "showURL": true
                },
                "lineType": "URL"
              },
              {
                "text": {
                  "value": "Thank you for your business!",
                  "size": "Body",
                  "align": "Center"
                },
                "lineType": "Text"
              }
            ]
          }
        }
      },
      "PaymentWithLockId": {
        "description": "",
        "required": [
          "paidAmount",
          "paymentIntentId"
        ],
        "type": "object",
        "properties": {
          "paymentIntentId": {
            "description": "",
            "type": "string"
          },
          "paidAmount": {
            "description": "Indicates the paid amount of this specific payment, excluding `tipsAmount` but includes eventual service charges.",
            "$ref": "#/components/schemas/Money"
          },
          "tipsAmount": {
            "$ref": "#/components/schemas/Money",
            "description": "The tip amount added to this specific payment. It is not included in `paidAmount`."
          },
          "lockId": {
            "description": "The unique ID of a lock generated by Dojo. Consuming this isn't strictly required as Dojo will create at most one lock per order, but it can be useful for tracking the lifecycle of any lock.",
            "type": "string"
          }
        }
      },
      "PartyDeposit": {
        "title": "Party Deposit",
        "description": "Information about payments captured pre-arrival to secure the reservation.",
        "required": [
          "totalAmount",
          "paymentIntentIds"
        ],
        "properties": {
          "totalAmount": {
            "$ref": "#/components/schemas/Money",
            "description": "The deposit value of the party at the time it was seated. The common\nflow for this field is that it is set by the Dojo VQ&B RMS shortly\nafter a party referring to a reservation (with a deposit) is\ncreated."
          },
          "description": {
            "type": "string",
            "description": "A human-readable description of the deposit. This may be used to\ndescribe the reason for the deposit, or any other relevant information.",
            "example": "Sunday Lunch deposit - 4 covers"
          },
          "paymentIntentIds": {
            "description": "List of payment-intents that were captured to make the deposit.\nSome may have been either partially or wholly refunded.\n\nMay not be edited by the EPOS partner.",
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "CreatePartyRequest": {
        "title": "Create Party Request",
        "description": "Request payload made from Dojo -> EPOS Partner to create a new party in the EPOS domain. Note that Dojo will always provide _all_ known fields.",
        "properties": {
          "name": {
            "title": "Name",
            "type": "string"
          },
          "covers": {
            "title": "Covers",
            "type": "integer"
          },
          "tableIds": {
            "title": "Table IDs",
            "type": "array",
            "items": {
              "type": "string"
            },
            "minLength": 1
          },
          "status": {
            "title": "Status",
            "type": "string"
          },
          "startTime": {
            "title": "Start time",
            "type": "string",
            "format": "date-time",
            "description": "When the party was seated. ISO8601 formatted, ms precise."
          },
          "expectedEndTime": {
            "title": "Expected end time",
            "type": "string",
            "format": "date-time",
            "description": "When the party is expected to leave, if known. ISO8601 formatted, ms precise."
          },
          "hostNotes": {
            "title": "Host notes",
            "type": "string"
          },
          "guestRequests": {
            "title": "Guest requests",
            "type": "string"
          },
          "reservationId": {
            "title": "Reservation ID",
            "type": "string"
          },
          "deposit": {
            "$ref": "#/components/schemas/PartyDeposit"
          },
          "dojoPartyId": {
            "title": "For reference. The Dojo API party ID.",
            "type": "string"
          },
          "dojoReservationId": {
            "title": "For reference. The Dojo API reservation ID.",
            "type": "string"
          }
        },
        "required": [
          "startTime",
          "tableIds",
          "dojoPartyId"
        ],
        "example": {
          "name": "Martin B.",
          "covers": 4,
          "tableIds": [
            "table-01-001",
            "table-01-002"
          ],
          "startTime": "2024-08-12T09:30:00.000Z",
          "expectedEndTime": "2024-08-12T11:00:00.000Z",
          "guestRequests": "nut allergy; gluten intolerance; please could we have a table next to a window?",
          "hostNotes": "called ahead to notify kitchen of dietary requirements - confirm upon arrival",
          "reservationId": "reservation-2024-08-12-0028",
          "deposit": {
            "totalAmount": {
              "value": 5000,
              "currencyCode": "GBP"
            }
          }
        }
      },
      "Party": {
        "title": "Party",
        "description": "The representation of a customer or group of customers _currently_\nseated at/across a set of tables.",
        "required": [
          "id",
          "startTime",
          "status",
          "tableIds"
        ],
        "type": "object",
        "properties": {
          "id": {
            "title": "ID",
            "description": "The EPOS-internal ID for this party. Must be globally unique within \nthe EPOS' domain.",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "description": "The human-readable name, typically the name of the lead guest.",
            "type": "string"
          },
          "covers": {
            "title": "Covers",
            "description": "The number of covers this party occupies.",
            "type": "integer"
          },
          "tableIds": {
            "title": "Table IDs",
            "description": "The set of tables this party is currently sat across.",
            "minItems": 1,
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "status": {
            "title": "Status",
            "description": "An arbitrary description of the party's current status - typically \nused to show where in their journey the party is, such as \n\"partially arrived\", \"ordered\" or \"paying\"/\"paid\".",
            "minLength": 1,
            "type": "string"
          },
          "startTime": {
            "format": "date-time",
            "title": "Start time",
            "description": "The time the party was seated. ISO8601 formatted, millisecond\nprecision.",
            "type": "string"
          },
          "expectedEndTime": {
            "format": "date-time",
            "title": "Expected end time",
            "description": "The time the party is expected to depart, if known. ISO8601\nformatted, millisecond precision.",
            "type": "string"
          },
          "endTime": {
            "format": "date-time",
            "title": "Actual end time",
            "description": "The time the party actually departed. ISO8601 formatted, millisecond\nprecision.",
            "type": "string"
          },
          "hostNotes": {
            "title": "Host notes",
            "description": "Host-written notes about the party. Not surfaced to the Guest(s).",
            "type": "string"
          },
          "guestRequests": {
            "title": "Guest requests",
            "description": "Guest-written requests for the party. Surfaced to & editable by the \nGuest(s). May not be edited by the EPOS partner, as this may contain\ndietary requirements set by the Guest.",
            "type": "string"
          },
          "reservationId": {
            "title": "Reservation ID",
            "description": "If reservations are implemented & this party has an associated \nreservation, the EPOS-internal ID of the reservation this party \ncorresponds to.",
            "type": "string"
          },
          "deposit": {
            "$ref": "#/components/schemas/PartyDeposit"
          }
        },
        "example": {
          "id": "party-2024-08-12-0001",
          "startTime": "2024-08-12T09:30:00.000Z",
          "status": "Ordered",
          "tableIds": [
            "table-01-001",
            "table-01-002"
          ]
        }
      },
      "UpdatePartyRequest": {
        "title": "Update Party Request",
        "description": "The representation of a customer or group of customers _currently_\nseated at/across a set of tables.",
        "required": [
          "dojoPartyId",
          "startTime",
          "status",
          "tableIds"
        ],
        "type": "object",
        "properties": {
          "dojoPartyId": {
            "description": "The Dojo API party ID",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "description": "The human-readable name, typically the name of the lead guest.",
            "type": "string"
          },
          "covers": {
            "title": "Covers",
            "description": "The number of covers this party occupies.",
            "type": "integer"
          },
          "tableIds": {
            "title": "Table IDs",
            "description": "The set of tables this party is currently sat across.",
            "minItems": 1,
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "status": {
            "title": "Status",
            "description": "An arbitrary description of the party's current status - typically \nused to show where in their journey the party is, such as \n\"partially arrived\", \"ordered\" or \"paying\"/\"paid\".",
            "minLength": 1,
            "type": "string"
          },
          "startTime": {
            "format": "date-time",
            "title": "Start time",
            "description": "The time the party was seated. ISO8601 formatted, millisecond\nprecision.",
            "type": "string"
          },
          "expectedEndTime": {
            "format": "date-time",
            "title": "Expected end time",
            "description": "The time the party is expected to depart, if known. ISO8601\nformatted, millisecond precision.",
            "type": "string"
          },
          "endTime": {
            "format": "date-time",
            "title": "Actual end time",
            "description": "The time the party actually departed. ISO8601 formatted, millisecond\nprecision.",
            "type": "string"
          },
          "hostNotes": {
            "title": "Host notes",
            "description": "Host-written notes about the party. Not surfaced to the Guest(s).",
            "type": "string"
          },
          "guestRequests": {
            "title": "Guest requests",
            "description": "Guest-written requests for the party. Surfaced to & editable by the \nGuest(s). May not be edited by the EPOS partner, as this may contain\ndietary requirements set by the Guest.",
            "type": "string"
          },
          "deposit": {
            "$ref": "#/components/schemas/PartyDeposit"
          }
        },
        "example": {
          "startTime": "2024-08-12T09:30:00.000Z",
          "status": "Ordered",
          "tableIds": [
            "table-01-001",
            "table-01-002"
          ]
        }
      },
      "CreateReservationRequest": {
        "properties": {
          "dojoReservationId": {
            "title": "DojoReservationID",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "covers": {
            "title": "Covers",
            "type": "integer"
          },
          "startTime": {
            "title": "Start time",
            "type": "string",
            "format": "date-time",
            "description": "When the reservation is expected to arrive. ISO8601 formatted, ms precise."
          },
          "endTime": {
            "title": "End time",
            "type": "string",
            "format": "date-time",
            "description": "When the reservation is expected to depart. ISO8601 formatted, ms precise."
          },
          "tableIds": {
            "title": "Table IDs",
            "type": "array",
            "items": {
              "type": "string"
            },
            "minLength": 1
          },
          "hostNotes": {
            "title": "Notes",
            "type": "string"
          },
          "guestRequests": {
            "title": "Requests",
            "type": "string"
          }
        },
        "required": [
          "dojoReservationId",
          "name",
          "covers",
          "startTime",
          "endTime",
          "tableIds"
        ],
        "example": {
          "dojoReservationId": "dojo-res-210345",
          "name": "Sasha J.",
          "covers": 3,
          "startTime": "2024-08-12T13:00:00.000Z",
          "endTime": "2024-08-12T15:00:00.000Z",
          "tableIds": [
            "table-02-003",
            "table-02-004"
          ],
          "guestRequests": "we'll be bringing our dog",
          "hostNotes": "dog may be given little snacks"
        }
      },
      "Reservation": {
        "title": "Reservation",
        "description": "A reservation describes a point in the future that a party is expected\nto be seated at, how long for, and where.",
        "required": [
          "id",
          "name",
          "covers",
          "startTime",
          "endTime",
          "tableIds"
        ],
        "type": "object",
        "properties": {
          "id": {
            "title": "ID",
            "description": "The globally unique (within the EPOS) ID for the reservation.",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "description": "The name of the guest who the reservation is for.",
            "type": "string"
          },
          "covers": {
            "title": "Covers",
            "description": "The number of covers the reservation is expected to occupy.",
            "type": "integer"
          },
          "startTime": {
            "format": "date-time",
            "title": "Start time",
            "description": "The time the reservation is expected to begin. ISO8601 formatted,\nmillisecond precision.",
            "type": "string"
          },
          "endTime": {
            "format": "date-time",
            "title": "End time",
            "description": "The time the reservation is expected to finish. ISO8601 formatted,\nmillisecond precision.",
            "type": "string"
          },
          "tableIds": {
            "title": "Table IDs",
            "description": "The tables the reservation is expected to occupy.",
            "minLength": 1,
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "hostNotes": {
            "title": "Host notes",
            "description": "Host-written notes about the reservation. Not exposed to guests.",
            "type": "string"
          },
          "guestRequests": {
            "title": "Guest requests",
            "description": "Guest-written requests for the reservation. Shown to & editable by\nguests. May not be edited by the EPOS partner, as this may contain\ndietary requirements set by the Guest.",
            "type": "string"
          }
        },
        "example": {
          "id": "reservation-2024-08-12-0065",
          "name": "Sasha J.",
          "covers": 3,
          "startTime": "2024-08-12T13:00:00.000Z",
          "endTime": "2024-08-12T15:00:00.000Z",
          "tableIds": [
            "table-02-003",
            "table-02-004"
          ]
        }
      },
      "UpdateReservationRequest": {
        "title": "Update Reservation Request",
        "description": "A reservation describes a point in the future that a party is expected\nto be seated at, how long for, and where.",
        "required": [
          "dojoReservationId",
          "name",
          "covers",
          "startTime",
          "endTime",
          "tableIds"
        ],
        "type": "object",
        "properties": {
          "dojoReservationId": {
            "description": "The Dojo API reservation ID",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "description": "The name of the guest who the reservation is for.",
            "type": "string"
          },
          "covers": {
            "title": "Covers",
            "description": "The number of covers the reservation is expected to occupy.",
            "type": "integer"
          },
          "startTime": {
            "format": "date-time",
            "title": "Start time",
            "description": "The time the reservation is expected to begin. ISO8601 formatted,\nmillisecond precision.",
            "type": "string"
          },
          "endTime": {
            "format": "date-time",
            "title": "End time",
            "description": "The time the reservation is expected to finish. ISO8601 formatted,\nmillisecond precision.",
            "type": "string"
          },
          "tableIds": {
            "title": "Table IDs",
            "description": "The tables the reservation is expected to occupy.",
            "minLength": 1,
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "hostNotes": {
            "title": "Host notes",
            "description": "Host-written notes about the reservation. Not exposed to guests.",
            "type": "string"
          },
          "guestRequests": {
            "title": "Guest requests",
            "description": "Guest-written requests for the reservation. Shown to & editable by\nguests. May not be edited by the EPOS partner, as this may contain\ndietary requirements set by the Guest.",
            "type": "string"
          }
        },
        "example": {
          "name": "Sasha J.",
          "covers": 3,
          "startTime": "2024-08-12T13:00:00.000Z",
          "endTime": "2024-08-12T15:00:00.000Z",
          "tableIds": [
            "table-02-003",
            "table-02-004"
          ]
        }
      },
      "SearchReservationsRequest": {
        "description": "",
        "type": "object",
        "properties": {
          "cursor": {
            "$ref": "#/components/schemas/Cursor"
          },
          "tableId": {
            "type": "string",
            "description": ""
          },
          "fromTime": {
            "format": "date-time",
            "description": "",
            "type": "string"
          },
          "toTime": {
            "format": "date-time",
            "description": "",
            "type": "string"
          }
        }
      },
      "PagedReservationsResponse": {
        "title": "PagedOrder",
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Reservation"
            },
            "readOnly": false,
            "x-stoplight": {
              "id": "ou7je7f6bizdg"
            }
          },
          "before": {
            "type": "string",
            "x-stoplight": {
              "id": "jutkpidtbhr6q"
            }
          },
          "after": {
            "type": "string",
            "x-stoplight": {
              "id": "vwlxjfle0yxqt"
            }
          }
        },
        "x-stoplight": {
          "id": "bjkxvbo62zl42"
        }
      },
      "SearchPartiesRequest": {
        "description": "",
        "type": "object",
        "properties": {
          "cursor": {
            "$ref": "#/components/schemas/Cursor"
          },
          "completedOnly": {
            "description": "",
            "type": "boolean"
          },
          "tableId": {
            "description": "",
            "type": "string"
          }
        }
      },
      "PagedPartiesResponse": {
        "title": "PagedOrder",
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Party"
            },
            "readOnly": false,
            "x-stoplight": {
              "id": "ou7je7f6bizdg"
            }
          },
          "before": {
            "type": "string",
            "x-stoplight": {
              "id": "jutkpidtbhr6q"
            }
          },
          "after": {
            "type": "string",
            "x-stoplight": {
              "id": "vwlxjfle0yxqt"
            }
          }
        },
        "x-stoplight": {
          "id": "bjkxvbo62zl42"
        }
      },
      "SearchTablesRequest": {
        "description": "",
        "type": "object",
        "properties": {
          "cursor": {
            "$ref": "#/components/schemas/Cursor"
          },
          "areaId": {
            "description": "",
            "type": "string"
          },
          "waiterId": {
            "description": "",
            "type": "string"
          }
        }
      },
      "Table": {
        "title": "Root Type for Table",
        "description": "",
        "required": [
          "id",
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "description": "User friendly name to identify the table. Must be unique for an area. Will be displayed on the card machine.",
            "type": "string"
          },
          "maxCovers": {
            "format": "int32",
            "description": "Max number of covers at this table.",
            "type": "integer"
          },
          "areaId": {
            "description": "ID of an area",
            "type": "string"
          },
          "waiterIds": {
            "description": "An array of waiter IDs serving this table",
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "example": {
          "id": "tbl_12345",
          "name": "Table 12",
          "maxCovers": 4,
          "areaId": "area_123"
        }
      },
      "PagedTablesResponse": {
        "title": "PagedOrder",
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Table"
            },
            "readOnly": false,
            "x-stoplight": {
              "id": "ou7je7f6bizdg"
            }
          },
          "before": {
            "type": "string",
            "x-stoplight": {
              "id": "jutkpidtbhr6q"
            }
          },
          "after": {
            "type": "string",
            "x-stoplight": {
              "id": "vwlxjfle0yxqt"
            }
          }
        },
        "x-stoplight": {
          "id": "bjkxvbo62zl42"
        }
      }
    }
  }
}